cel: automatycznie IMPORT OK co się da; IMPORT - 5000 zapisów z ukd i deskryptorami najbardziej literackimi; reszta nie wchodzi

options(java.parameters = "-Xmx32000m")
Komunikaty ostrzegawcze:
1: package ‘RJDBC’ was built under R version 3.5.3 
2: package ‘rJava’ was built under R version 3.5.3 
options(scipen = 999)
pacman::p_load(utf8,googlesheets4,zoo,stringr,splitstackshape,plyr,dplyr,sqldf,stringdist,fuzzyjoin,data.table,svMisc,tidyverse,RJDBC,arrangements,tokenizers,openxlsx)

#połączenie z bazą PBL
jdbcDriver =JDBC("oracle.jdbc.OracleDriver",classPath="C:/Users/Cezary/Downloads/ojdbc6.jar")
PBL <- dbConnect(jdbcDriver, "jdbc:oracle:thin:@//pbl.ibl.poznan.pl:1521/xe", "IBL_SELECT", "CR333444")
tworca_i_dzial <- dbGetQuery(PBL,
                             "select tw.tw_tworca_id \"pbl_id\", dz.dz_dzial_id||'|'||dz.dz_nazwa \"osoba_pbl_dzial_id_name\"
                              from pbl_tworcy tw
                              full join pbl_dzialy dz on dz.dz_dzial_id=tw.tw_dz_dzial_id")

#listy nazwisk BN ze zbioru
#100
marc_field_100 <- bn_ks %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ks$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_100 <- marc_field_100 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))

osoba_bn_100_pbl <- marc_field_100 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  select(1:3) %>%
  left_join(.,tworca_i_dzial,by = "pbl_id") %>%
  select(id,osoba_pbl_dzial_id_name) %>%
  group_by(id) %>%
  mutate(osoba_bn_autor = paste(unique(osoba_pbl_dzial_id_name),collapse = "~")) %>%
  select(-osoba_pbl_dzial_id_name) %>%
  ungroup() %>%
  unique()
Column `name`/`BN_name` joining character vector and factor, coercing into character vector
#600
marc_field_600 <- bn_ks %>%
  select(id,X600)%>%
  filter(X600!="") %>%
  mutate(X600=str_replace_all(X600,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X600",sep = "~",direction = "long") %>%
  filter(X600!="") %>%
  mutate(X600=str_remove_all(X600,"^\\|")) %>%
  mutate(indicator = str_replace_all(X600,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ks$X600,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_600)[1]))
colnames(empty_table) <-subfield_list
marc_field_600<-cbind(marc_field_600,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")
x <- 1:length(subfield_list)

for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_600$X600 <- str_replace(marc_field_600$X600,subfield_list_char[i],"|\\1")
}
Progress:  1 on 15  Progress:  2 on 15  Progress:  3 on 15  Progress:  4 on 15  Progress:  5 on 15  Progress:  6 on 15  Progress:  7 on 15  Progress:  8 on 15  Progress:  9 on 15  Progress: 10 on 15  Progress: 11 on 15  Progress: 12 on 15  Progress: 13 on 15  Progress: 14 on 15  Progress: 15 on 15  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_600[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_600$X600),str_replace_all(gsub(string,"\\3",marc_field_600$X600),"\\${2}.", "~"),NA)
}
Progress:  1 on 15  Progress:  2 on 15  Progress:  3 on 15  Progress:  4 on 15  Progress:  5 on 15  Progress:  6 on 15  Progress:  7 on 15  Progress:  8 on 15  Progress:  9 on 15  Progress: 10 on 15  Progress: 11 on 15  Progress: 12 on 15  Progress: 13 on 15  Progress: 14 on 15  Progress: 15 on 15  
marc_field_600 <- marc_field_600 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))
osoba_bn_600_pbl <- marc_field_600 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  select(1:3) %>%
  left_join(.,tworca_i_dzial,by = "pbl_id") %>%
  select(id,osoba_pbl_dzial_id_name) %>%
  group_by(id) %>%
  mutate(osoba_bn_temat = paste(unique(osoba_pbl_dzial_id_name),collapse = "~")) %>%
  select(-osoba_pbl_dzial_id_name) %>%
  ungroup() %>%
  unique()
Column `name`/`BN_name` joining character vector and factor, coercing into character vector
##700
#marc_field_700 <- bn_ks %>%
#  select(id,X700)%>%
#  filter(X700!="") %>%
#  mutate(X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
#  cSplit(.,"X700",sep = "~",direction = "long") %>%
#  filter(X700!="") %>%
#  mutate(X700=str_remove_all(X700,"^\\|")) %>%
#  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1"))
#subfield_list<- str_extract_all(bn_ks$X700,"\\$.")
#subfield_list<- unique(unlist(subfield_list))
#empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
#colnames(empty_table) <-subfield_list
#marc_field_700<-cbind(marc_field_700,empty_table)
#subfield_list_char <- paste("(",subfield_list,")",sep = "")
#subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")
#x <- 1:length(subfield_list)
#
#for (i in x) {
#  progress(match(i,x), max.value = length(x)) 
#  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
#}
#for (i in x) {
#  progress(match(i,x), max.value = length(x)) 
#  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
#  string_a <- "(^)(.*?\\|"
#  string_b <- subfield_list_char2[i]
#  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
#  string <- paste(string_a,string_b,string_c,sep = "")
#  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
#}
#marc_field_700 <- marc_field_700 %>%
#  select(id,`$a`,`$d`,`$c`) %>%
#  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
#  select(id,name) %>%
#  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
#         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))

###sprawdzić czy nie ma zdublowanego mapowania BN->PBL (czy np. jedna osoba z BN nie zasila kilku twórców PBL)

bn_ks <- bn_ks %>%
  full_join(.,osoba_bn_100_pbl,by = "id") %>%
  full_join(.,osoba_bn_600_pbl,by = "id")
#wskazanie interesujących PBL dziedzin wiedzy po UKD i określenie typu UKD
bn_ks <- bn_ks %>%
  mutate(dziedzina_PBL = ifelse(str_detect(X080,"(?<=\\$a|:|\\[|\\+|\\()(82)"),"ukd_lit",
                                ifelse(str_detect(X080,"(?<=\\$a|:|\\[|\\+)(791)")|str_detect(X080,"(?<=\\$a|:)(792)")|str_detect(X080,"\\$a7\\.09"),"ukd_tfrtv",
                                       ifelse(str_detect(X080,"(?<=\\$a01)(\\(|\\/|2|4|5|9)")|str_detect(X080,"(?<=\\$a|\\[])(050)"),"ukd_biblio",
                                              ifelse(str_detect(X080,"\\$a002")|str_detect(X080,"(?<=\\$a|:)(305)")|str_detect(X080,"(?<=\\$a39|:39)(\\(438\\)|8\\.2)")|str_detect(X080,"(?<=\\$a|:)(929[^\\.]051)"),"ukd_pogranicze","bez_ukd_PBL")))))
#wskazanie interesujących PBL rekordów bez UKD, które są w kluczu PBL
bez_ukd_ale_PBL <- bn_ks %>%
  select(id, X080, X650, X655, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL) %>%
  filter(dziedzina_PBL == "bez_ukd_PBL"&X080==""&is.na(osoba_bn_autor)&is.na(osoba_bn_temat)) %>%
  mutate(bez_ukd_ale_PBL = grepl("literat|literac|pisar|bajk|dramat|epigramat|esej|felieton|film|komedi|nowel|opowiadani|pamiętnik|poemiks|poezj|powieść|proza|reportaż|satyr|wspomnieni|Scenariusze zajęć|Podręczniki dla gimnazjów|teatr|Nagrod|aforyzm|baśń|baśnie|polonijn|dialogi|fantastyka naukowa|legend|pieśń|poemat|przypowieś|honoris causa|filologi|kino polskie|pieśni",X650, ignore.case = TRUE)|grepl("literat|literac|pisar|bajk|dramat|epigramat|esej|felieton|film|komedi|nowel|opowiadani|pamiętnik|poemiks|poezj|powieść|proza|reportaż|satyr|wspomnieni|Scenariusze zajęć|Podręczniki dla gimnazjów|teatr|Nagrod|aforyzm|baśń|baśnie|polonijn|dialogi|fantastyka naukowa|legend|pieśń|poemat|przypowieś|honoris causa|filologi|kino polskie|pieśni",X655,ignore.case = TRUE)) %>%
  filter(bez_ukd_ale_PBL == TRUE) %>%
  select(id) %>%
  mutate(bez_ukd_ale_PBL = "tak")

bn_ks <- bn_ks %>%
  full_join(.,bez_ukd_ale_PBL,by = "id")

#wspomnienia,pamiętniki,literatura podróżnicza,reportaż
wspomnienia <- bn_ks %>%
  mutate(czy_wspomnienia_reportaz = ifelse(str_detect(X655,"Pamiętniki i wspomnienia")|str_detect(X655,"Literatura podróżnicza")|str_detect(X655,"Pamiętniki")|str_detect(X655,"Reportaż"),"tak",NA)) %>%
  select(id,czy_wspomnienia_reportaz) %>%
  unique()
bn_ks <- bn_ks %>%
  full_join(.,wspomnienia,by = "id")

#słowa literackie w polu 245
rekordy_slowa <- sqldf("select *
                    from bn_ks a
                    where LOWER(a.X245) like ('%'||'pisar'||'%')
                   or LOWER(a.X245) like ('%'||'literat'||'%')
                   or LOWER(a.X245) like ('%'||'literac'||'%')
                   or LOWER(a.X245) like ('%'||'teatr'||'%')
                   or LOWER(a.X245) like ('%'||'film'||'%')
                   or LOWER(a.X245) like ('%'||'dramat'||'%')") %>%
  select(id) %>%
  mutate(slowa_literackie = "tak") %>%
  unique()
bn_ks <- bn_ks %>%
  full_join(.,rekordy_slowa,by = "id")

bn_ok <- bn_ks %>%
  filter(!((is.na(osoba_bn_autor)&is.na(osoba_bn_temat))&dziedzina_PBL=="bez_ukd_PBL"&is.na(bez_ukd_ale_PBL)&is.na(czy_wspomnienia_reportaz)&is.na(slowa_literackie)))

#czy tu usunąć zdublowane isbny?
#020
marc_field_020 <- bn_ok %>%
  select(id,X020)%>%
  filter(X020!="") %>%
  mutate(X020=str_replace_all(X020,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X020",sep = "~",direction = "long") %>%
  filter(X020!="") %>%
  mutate(X020=str_remove_all(X020,"^\\|")) %>%
  mutate(indicator = str_replace_all(X020,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ok$X020,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_020)[1]))
colnames(empty_table) <-subfield_list
marc_field_020<-cbind(marc_field_020,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_020$X020 <- str_replace(marc_field_020$X020,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_020[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_020$X020),str_replace_all(gsub(string,"\\3",marc_field_020$X020),"\\${2}.", "~"),NA)
}
marc_field_020 <- marc_field_020 %>%
  select(id,isbn=`$a`)

distance1 <- bn_ok %>%
  filter(!grepl("\\$n",X245)) %>%
  left_join(.,marc_field_020,by="id") %>%
  mutate(porownanie = paste(isbn,substr(str_to_lower(str_replace_all(X245, "\\W", "")),4,14),str_extract(X300,"(?<=\\$a)(.*?)(?=,| )"),sep = "|"))

count <- as.data.frame(table(distance1$porownanie))

distance1 <- merge(distance1,count,by.x = "porownanie",by.y = "Var1",all.x = TRUE) %>%
  select(porownanie,Freq,2:155) %>%
  arrange(-Freq,porownanie) %>%
  select(porownanie,Freq,id) %>%
  cSplit(.,"porownanie",sep = "|",direction = "wide")

#poszukanie dystansu Levenshteina == 1 przy takim samym ISBN

distance2 <- distance1 %>%
  filter(!is.na(porownanie_1)) %>%
  group_by(porownanie_1) %>%
  mutate(Freq = paste(Freq,collapse = "|"),
         id = paste(id,collapse = "|"),
         porownanie_2 = paste(porownanie_2,collapse = "|"),
         porownanie_3 = paste(porownanie_3,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(ile = str_count(porownanie_2,"\\|")+1) %>%
  arrange(-ile) %>%
  mutate(id_grupy = 1:lengths(.)) %>%
  filter(ile>1) %>%
  cSplit(.,c("Freq","id","porownanie_2","porownanie_3"),sep = "|",direction = "long") %>%
  unique() %>%
  filter(!is.na(id))

permutations <- data.frame(stringsAsFactors = FALSE)
x <- 1:max(distance2$id_grupy)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  distance3 <- as.vector(unlist(distance2 %>% filter(id_grupy==i) %>% select(porownanie_2)))
  iteration <- as.data.frame(permutations(distance3,2)) %>%
    mutate(id_grupy = i)
  y <- 1:length(iteration$V1)
  for (j in y) {
    progress(match(j,y), max.value = length(y))
    iteration$distance[j] <- adist(iteration$V1[j],iteration$V2[j])
  }
  permutations <- rbind(permutations,iteration)
}

permutations <- permutations %>%
  filter(distance==1)

distance2 <- distance2 %>%
  filter(id_grupy %in% permutations$id_grupy) %>%
  select(id,id_grupy)
#połączyć distance2 z distance1, żeby wydobyć pełną listę zdublowanych książek
duble_ksiazek <- distance1 %>%
  unite("porownanie", porownanie_1:porownanie_3, sep = "|") %>%
  filter(Freq>1) %>%
  full_join(.,distance2,by="id")

duble_ksiazek$same <- cumsum(!duplicated(duble_ksiazek$porownanie))

duble_ksiazek <- duble_ksiazek %>%
  arrange(id_grupy,same) %>%
  mutate(id_grupy_dubli = ifelse(!is.na(id_grupy),as.character(id_grupy),paste("x",same,sep = ""))) %>%
  select(id,id_grupy_dubli) %>%
  arrange(id_grupy_dubli)

duble_ksiazek$id_grupy_dubli <- cumsum(!duplicated(duble_ksiazek$id_grupy_dubli))
#uzupełnienie całego zbioru o informację o dublu, wydobycie dubli do osobnego pliku i usuniecie ich z głównego pliku z rekordami bn; wskazanie listy interesujących pól
bn_ok <- bn_ok %>%
  left_join(.,duble_ksiazek,by="id") %>%
  select(id, X008, X009, X015, X041, X044, X080, X100, X245, X246, X250, X260, X300, X380, X386, X490, X500, X501, X546, X600, X650, X655, X700, X710, X800, X830, rok, BN_URL, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL, bez_ukd_ale_PBL, czy_wspomnienia_reportaz, slowa_literackie, id_grupy_dubli)

duble_ksiazek <- bn_ok %>%
  filter(!is.na(id_grupy_dubli)) %>%
  arrange(id_grupy_dubli)

bn_ok <- bn_ok %>%
  filter(is.na(id_grupy_dubli))
#wpisanie w zdublowane rekordy jak największej ilości danych (suma wszystkich dubli)
duble_ksiazek <- duble_ksiazek %>%
  arrange(id_grupy_dubli,-nchar(X015))
duble_ksiazek[is.na(duble_ksiazek)] <- ""
duble_naprawione <- data.frame(stringsAsFactors = FALSE)
x <- 1:max(duble_ksiazek$id_grupy_dubli)
y <- c(4:27,29:34)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  iteration <- duble_ksiazek %>%
    filter(id_grupy_dubli==i)
  for (j in y) {
    if (j==30) {
      iteration[,j] <- iteration[,j][nchar(iteration[,j])==min(nchar(iteration[,j]))][1]
    } else {
        iteration[,j] <- iteration[,j][nchar(iteration[,j])==max(nchar(iteration[,j]))][1]
      }
  }
  duble_naprawione <- rbind(duble_naprawione,iteration)
}
#pozostawienie pojedynczych wierszy dla książek
duble_naprawione <- duble_naprawione[!duplicated(duble_naprawione$id_grupy_dubli),]
duble_naprawione <- duble_naprawione %>%
  mutate(osoba_bn_autor = ifelse(osoba_bn_autor!="",as.character(osoba_bn_autor),NA),
         osoba_bn_temat = ifelse(osoba_bn_temat!="",as.character(osoba_bn_temat),NA),
         dziedzina_PBL = ifelse(dziedzina_PBL!="",as.character(dziedzina_PBL),NA),
         bez_ukd_ale_PBL = ifelse(bez_ukd_ale_PBL!="",as.character(bez_ukd_ale_PBL),NA),
         czy_wspomnienia_reportaz = ifelse(czy_wspomnienia_reportaz!="",as.character(czy_wspomnienia_reportaz),NA),
         slowa_literackie = ifelse(slowa_literackie!="",as.character(slowa_literackie),NA),)
#połączenie unikatowych książek z dubli z całym zbiorem
bn_ok <- bn_ok %>%
  bind_rows(.,duble_naprawione) %>%
  select(-id_grupy_dubli)

#usunięcie zagranicznych zapisów, które nie są polonikami 
#na podstawie braku wystąpień frazy "pol" w polach MARC
nie_poloniki <- bn_ok %>%
  filter(if (X501=="") !grepl("pl",substr(X008,16,18))) %>%
  filter(!grepl("pol",substr(X008,36,38))) %>%
  filter(!grepl("pol",X041)) %>%
  filter(!grepl("pl",X044)) %>%
  filter(!grepl("pol",X500,ignore.case = TRUE)) %>%
  filter(!grepl("pol",X501,ignore.case = TRUE)) %>%
  filter(!grepl("pol",X546,ignore.case = TRUE)) %>%
  select(id) %>%
  mutate(czy_polonik = "nie") %>%
  unique()

#na postawie wystąpień twórców pbl w polach uwag
#czy warto? co zrobić z case insensitivenes? --> za dużo śmieci wpada, zrezygnowałem z tego

bn_ok <- bn_ok %>%
  full_join(.,nie_poloniki,by = "id") %>%
  select(id, X008, X009, X041, X044, X080, X100, X245, X246, X250, X260, X300, X380, X386, X490, X500, X501, X500, X546, X600, X650, X655, X700, X710, X800, X830, rok, BN_URL, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL, bez_ukd_ale_PBL, czy_wspomnienia_reportaz, slowa_literackie, czy_polonik) %>%
  unique()
#wskazanie niepoloników i usunięcie ze zbioru
nie_poloniki <- bn_ok %>%
  filter(czy_polonik=="nie") %>%
  filter(is.na(osoba_bn_autor)|is.na(osoba_bn_temat)|!(osoba_bn_autor %in% c("148|Hasła osobowe (literatura polska)","430|Hasła osobowe (Ludzie teatru i filmu)"))|!(osoba_bn_temat %in% c("148|Hasła osobowe (literatura polska)","430|Hasła osobowe (Ludzie teatru i filmu)")))
bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from nie_poloniki b)") %>%
  select(-czy_polonik)
zapisy <- RJDBC::dbGetQuery(PBL,
                            "select z.za_zapis_id, z.za_status_imp, z.za_uwagi
                            from pbl_zapisy z
                            where z.za_uwagi like '%import%'") %>%
  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
  select(ZA_ZAPIS_ID,pracownik_pbl,ZA_STATUS_IMP)

do_importu_NIE <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(X650,X655,ZA_STATUS_IMP) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7"),
         X655 = str_remove_all(X655,"\\\\7"),
         joint = paste(X650,X655,sep = "~")) %>%
  select(ZA_STATUS_IMP,joint) %>%
  group_by(joint) %>%
  mutate(grupa = paste(ZA_STATUS_IMP,collapse = ",")) %>%
  ungroup() %>%
  select(joint, grupa) %>%
  unique() %>%
  mutate(ile = str_count(grupa,",")+1) %>%
  filter(grepl("INO",grupa)) %>%
  filter(!grepl("IOK|IMP|IPN|IPC",grupa)) %>%
  mutate(czy = str_detect(joint,"\\$y[\\d-]+ w\\.")) %>%
  filter(czy==FALSE) %>%
  select(joint) %>%
  mutate(joint = str_remove_all(str_replace_all(joint,"(\\$a)","\\\\#7\\1"),"#")) %>%
  mutate(do_wyrzucenia_na_podstawie_INO = "tak")

bn_ok <- bn_ok %>%
  mutate(X650 = ifelse(X650=="",NA,as.character(X650)),
         X655 = ifelse(X655=="",NA,as.character(X655)),
         joint = paste(X650,X655,sep = "~")) %>%
  left_join(.,do_importu_NIE,by = "joint") %>%
  mutate(X650 = ifelse(is.na(X650),"",as.character(X650)),
         X655 = ifelse(is.na(X655),"",as.character(X655)))

do_importu_NIE <- bn_ok %>%
  filter(is.na(osoba_bn_autor)&is.na(osoba_bn_temat)&is.na(slowa_literackie)&do_wyrzucenia_na_podstawie_INO=="tak") %>%
  filter(!grepl("literat|literac|pamiętnik|pisar",X655,ignore.case = TRUE))

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from do_importu_NIE b)") %>%
  select(-joint,-do_wyrzucenia_na_podstawie_INO)

#usunięcie na podstawie tabel KP
out <- sheets_read(ss = "1lO_ZtwyBDePGqXkgWyk_WmGeQBaAQBvEUjNnctrw-vg") %>%
  filter(wchodzi_do_pbl == "nie")
Waiting for authentication in browser...
Press Esc/Ctrl + C to abort
Authentication complete.
Reading from 'X650 dla X655 Wydawnictwa popularne'
KP_out <- bn_ok %>%
  filter(grepl("Wydawnictwa popularne",X655)) %>%
  unique() %>%
  full_join(.,out,by = "X650") %>%
  filter(wchodzi_do_pbl=="nie") %>%
  filter(!is.na(X655)) %>%
  select(id)

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from KP_out b)")

#czy próbować wyrzucać po UKD, które dostawało tylko INO?
do_importu_NIE2 <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(X080,ZA_STATUS_IMP) %>%
  mutate(X080 = str_remove_all(X080,"\\\\")) %>%
  select(ZA_STATUS_IMP,X080) %>%
  group_by(X080) %>%
  mutate(grupa = paste(ZA_STATUS_IMP,collapse = ",")) %>%
  ungroup() %>%
  select(X080, grupa) %>%
  unique() %>%
  mutate(ile = str_count(grupa,",")+1) %>%
  filter(grepl("INO",grupa)) %>%
  filter(!grepl("IOK|IMP|IPN|IPC",grupa)) %>%
#tu się musi KP wypowiedzieć, czy jak było 2xNIE to wystarczy, żeby wywalać
#  filter(ile > 1) %>%
  select(X080) %>%
  mutate(X080 = paste("\\",str_remove_all(str_replace_all(X080,"(\\$a)","\\\\#\\1"),"#"),sep = "")) %>%
  mutate(do_wyrzucenia_na_podstawie_INO = "tak")

#na podstawie UKD też wyrzucić - decyzja KP
bn_ok <- bn_ok %>%
  full_join(.,do_importu_NIE2,by = "X080") %>%
  filter(!is.na(id))

do_importu_NIE2 <- bn_ok %>%
  filter(is.na(osoba_bn_autor)&is.na(osoba_bn_temat)&is.na(slowa_literackie)&do_wyrzucenia_na_podstawie_INO=="tak")

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from do_importu_NIE2 b)") %>%
  select(-do_wyrzucenia_na_podstawie_INO)

#reszta rekordów, które nie będą zaimportowane
reszta <- sqldf("select *
               from bn_ks a
               where a.id not in 
               (select b.id
               from bn_ok b)")
bn_ok <- bn_ok %>%
  mutate(czy_ma_ukd = ifelse(X080=="","nie","tak"),
         position_dash = ifelse(grepl("(\\\\\\\\\\$a|:)(821\\.)",X080),str_locate(X080,"\\-")[,1], NA),
         position_dash = ifelse(is.na(position_dash),"",as.integer(position_dash)),
         position_091 = str_locate(X080,"\\(091\\)")[,1],
         position_091 = ifelse(is.na(position_091),"",as.integer(position_091)),
         rodzaj_ksiazki = ifelse(grepl("Antologi",X655),"antologia",
                                 ifelse(position_091!=""&position_dash!="",
                          ifelse(as.integer(position_091)<as.integer(position_dash), "przedmiotowa", "podmiotowa"),
                          ifelse(position_dash!="","podmiotowa","przedmiotowa"))),
         rodzaj_ksiazki = ifelse(czy_ma_ukd=="nie","",as.character(rodzaj_ksiazki)))
gatunki_podmiotowe <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  select(X655) %>%
  unique() %>%
  cSplit(.,"X655",sep = "|",direction = "long") %>%
  unique() %>%
  filter(str_detect(X655,"\\$y[\\d-]+ w\\."))
gatunki_podmiotowe <- str_replace_all(str_replace_all(paste(gatunki_podmiotowe$X655,collapse = "|"),"(.{2})(\\$a)","\\2"),"\\$","\\\\$")
bn_ok$czy_podmiotowy <- grepl(gatunki_podmiotowe,bn_ok$X655)|grepl(gatunki_podmiotowe,bn_ok$X650)
bn_ok <- bn_ok %>%
  mutate(rodzaj_ksiazki = ifelse(str_count(X245, " / ")+1>2,"antologia",
                                 ifelse(str_count(X245, " / ")+1==2,"współwydanie",
                                        ifelse(rodzaj_ksiazki==""&czy_podmiotowy==TRUE&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                               ifelse(X100!=""&grepl("aPamiętnik|aLiteratura podróżnicza",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                      ifelse(X100!=""&grepl("aReportaż",X655)&grepl("\\$y",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                             ifelse(X100!=""&(X655=="\\7$aReportaż polski$2DBN"|X655=="\\7$aReportaż$2DBN")&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                                    ifelse(rodzaj_ksiazki==""&czy_podmiotowy==FALSE,"przedmiotowa",as.character(rodzaj_ksiazki)))))))),
         rodzaj_ksiazki = ifelse(rodzaj_ksiazki=="","przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Lektury Wszech Czasów : streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X490)|grepl("Lektury Wszech Czasów : streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X830),"przedmiotowa",as.character(rodzaj_ksiazki)),
         ilu_tworcow = str_count(X100,"\\$a"),
         rodzaj_ksiazki = ifelse(ilu_tworcow>4&rodzaj_ksiazki=="podmiotowa","antologia",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Legendy",X655),"antologia",as.character(rodzaj_ksiazki))) %>%
  select(1:30,rodzaj_ksiazki)
IOK_podm <- bn_ok %>%
  filter(!grepl("\\$t",X700)) %>%
  mutate(ile_gatunkow = ifelse(rodzaj_ksiazki=="podmiotowa",str_count(X655,"\\$a"),"nie"),
         tylko_podmiotowe = ifelse(str_count(X655,"\\$a")>0&str_count(X655,"\\$a")==str_count(X655,"\\$y")&str_count(X655,"\\$y")!=str_count(X655,"\\$x"),"tak","nie")) %>%
  filter(str_count(X100,"\\$a")==1) %>%
  filter(!grepl("pseud|nazwa",X500,ignore.case = TRUE)&X501==""&(tylko_podmiotowe=="tak"|ile_gatunkow=="1")&X100!="")

#zestawienie 100 i 245
#100
marc_field_100 <- IOK_podm %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(IOK_podm$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
marc_field_100 <- marc_field_100 %>%
  select(id,`$a`) %>%
  mutate(bn_nazwisko = ifelse(str_detect(`$a`,","),str_replace(`$a`,"^(.*?)(, )(.*?$)","\\1"),as.character(`$a`)),
         bn_imie = ifelse(str_detect(`$a`,","),str_replace(`$a`,"^(.*?)(, )(.*?$)","\\3"),"")) %>%
  select(id,bn_nazwisko,bn_imie)

IOK_podm <- IOK_podm %>%
  full_join(.,marc_field_100,by = "id")

x <- 1:length(IOK_podm$id)
for (i in x) {
  
  IOK_podm$czy_nazwisko[i] <- grepl(IOK_podm$bn_nazwisko[i],IOK_podm$X245[i])
  IOK_podm$czy_imie[i] <- grepl(IOK_podm$bn_imie[i],IOK_podm$X245[i])
  
}
#usunięcie tych, które nie mają tytułów oryginalnych
IOK_podm <- IOK_podm %>%
  filter(czy_nazwisko==1&czy_imie==1&!grepl("et al\\.",X245)) %>%
  select(-bn_nazwisko,-bn_imie,-czy_nazwisko,-czy_imie) %>%
  unique() %>%
  mutate(jezyk = str_extract(X041,("(?<=\\$h)(...)"))) %>%
  mutate(czy_tytul_obcy = ifelse(is.na(jezyk),"nie dotyczy",
                                 ifelse(!grepl("pol",jezyk),
                                        ifelse(X246!="","ok",
                                               ifelse(grepl("Tyt[,\\.] oryg",X501)|grepl("Tyt[,\\.] oryg",X500),"ok","problem")),"nie dotyczy"))) %>%
  filter(czy_tytul_obcy!="problem") %>%
  select(id) %>%
  mutate(automatyczna_podmiotowa = "tak")
###tutaj kończą się automatyczne podmiotowe

#automatyczny IOK dla przedmiotowych; osoba z PBL jako temat
#600
IOK_przedm <- bn_ok %>%
  filter(str_count(X600,"\\$a")==1)
marc_field_600 <- IOK_przedm %>%
  select(id,X600)%>%
  filter(X600!="") %>%
  mutate(X600=str_replace_all(X600,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X600",sep = "~",direction = "long") %>%
  filter(X600!="") %>%
  mutate(X600=str_remove_all(X600,"^\\|")) %>%
  mutate(indicator = str_replace_all(X600,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(IOK_przedm$X600,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_600)[1]))
colnames(empty_table) <-subfield_list
marc_field_600<-cbind(marc_field_600,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")
x <- 1:length(subfield_list)

for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_600$X600 <- str_replace(marc_field_600$X600,subfield_list_char[i],"|\\1")
}
Progress:  1 on 12  Progress:  2 on 12  Progress:  3 on 12  Progress:  4 on 12  Progress:  5 on 12  Progress:  6 on 12  Progress:  7 on 12  Progress:  8 on 12  Progress:  9 on 12  Progress: 10 on 12  Progress: 11 on 12  Progress: 12 on 12  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_600[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_600$X600),str_replace_all(gsub(string,"\\3",marc_field_600$X600),"\\${2}.", "~"),NA)
}
Progress:  1 on 12  Progress:  2 on 12  Progress:  3 on 12  Progress:  4 on 12  Progress:  5 on 12  Progress:  6 on 12  Progress:  7 on 12  Progress:  8 on 12  Progress:  9 on 12  Progress: 10 on 12  Progress: 11 on 12  Progress: 12 on 12  
marc_field_600 <- marc_field_600 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))

tworca_i_dzial <- dbGetQuery(PBL,
                             "select tw.tw_tworca_id \"pbl_id\", tw.tw_nazwisko||', '||tw.tw_imie \"tworca_pbl\", dz.dz_dzial_id||'|'||dz.dz_nazwa \"osoba_pbl_dzial_id_name\"
                              from pbl_tworcy tw
                              full join pbl_dzialy dz on dz.dz_dzial_id=tw.tw_dz_dzial_id")

bn_records_pbl_people <- marc_field_600 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  select(1:3) %>%
  left_join(.,tworca_i_dzial,by = "pbl_id")
Column `name`/`BN_name` joining character vector and factor, coercing into character vector
bn_records_pbl_people_id <- bn_records_pbl_people %>%
  select(id,tworca_pbl) %>%
  group_by(id) %>%
  mutate(tworca_pbl = paste(unique(tworca_pbl),collapse = "~")) %>%
  ungroup() %>%
  unique() %>%
  filter(!grepl("~",tworca_pbl))

IOK_przedm <- IOK_przedm %>%
  full_join(.,bn_records_pbl_people_id,by = "id") %>%
  filter(rodzaj_ksiazki=="przedmiotowa"&X600!=""&str_count(X600,"\\$a")==1&!is.na(tworca_pbl)) %>%
  mutate(czy_o_czyms = str_detect(X655,"\\$x"))
IOK_przedm$czy_gatunek <- grepl(gatunki_podmiotowe,IOK_przedm$X655)
IOK_przedm <- IOK_przedm %>%
  filter((grepl("tematyka|biografia|historia",X655,ignore.case = TRUE)|czy_o_czyms==TRUE)&!grepl("Księga pamiątkowa",X655)) %>%
  filter(grepl("((a|:)(821))|(791)",X080)) %>%
  select(id) %>%
  mutate(automatyczna_przedmiotowa = "tak")

bn_ok <- bn_ok %>%
  full_join(.,IOK_podm,by = "id") %>%
  full_join(.,IOK_przedm,by = "id") %>%
  mutate(czy_automatycznie = ifelse(!is.na(automatyczna_podmiotowa),"podmiotowa",
                                    ifelse(!is.na(automatyczna_przedmiotowa),"przedmiotowa","nie"))) %>%
  select(-automatyczna_podmiotowa,-automatyczna_przedmiotowa) %>%
  mutate(czy_automatycznie = ifelse(czy_automatycznie=="podmiotowa"&rodzaj_ksiazki!="podmiotowa","nie",as.character(czy_automatycznie)))

#write.csv2(bn_ok, "C:/Users/Cezary/Desktop/bn_ok_2009.csv", row.names = F, na = '', fileEncoding = 'UTF-8')
na_pozniej <- bn_ok %>%
  filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL=="bez_ukd_PBL") %>%
  mutate(kategorie_literackie = ifelse(grepl("mitolog|baś|bajk|poezj|liryk|epik|dramat|literac|literat|pisar|wiersz|proz|powieś|opowiad|miniatur|aforyzm|esej|szkic|feliet|report|dzienni|wspomnie|autobiograf|kaza|rozmyśl|list",X650,ignore.case = TRUE)|grepl("mitolog|baś|bajk|poezj|liryk|epik|dramat|literac|literat|pisar|wiersz|proz|powieś|opowiad|miniatur|aforyzm|esej|szkic|feliet|report|dzienni|wspomnie|autobiograf|kaza|rozmyśl|list",X655, ignore.case = TRUE),"tak","nie")) %>%
  filter(kategorie_literackie=="nie") %>%
  mutate(lata = ifelse(grepl("\\d{2}-",X100),str_replace(X100,"(.*\\$d\\(.*?)(\\d{2,4})(\\?{0,1}-.*)","\\2"),NA),
         lata_temat = ifelse(grepl("\\d{2}-",X600),str_replace(X600,"(.*\\$d\\(.*?)(\\d{2,4})(\\?{0,1}-.*)","\\2"),NA)) %>%
filter((is.na(lata)&is.na(lata_temat))|!(as.integer(lata)<1800)|!(as.integer(lata_temat)<1800)) %>%
  select(id)
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳ceniapojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
write.csv2(na_pozniej, "C:/Users/Cezary/Desktop/bn_2009_ks_na_pozniej.csv", row.names = F, na = '', fileEncoding = 'UTF-8')

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from na_pozniej b)")

Czy jest sens to robić?

###automatycznie działowanie przedmiotowej na podstawie dotychczasowych importów
#zapisy <- RJDBC::dbGetQuery(PBL,
#                            "select z.za_zapis_id, dz.dz_dzial_id, dz.dz_nazwa, z.za_status_imp, z.za_uwagi
#                            from pbl_zapisy z
#                            join pbl_dzialy dz on dz.dz_dzial_id=z.za_dz_dzial1_id
#                            where z.za_uwagi like '%import%'") %>%
#  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
#  select(-ZA_UWAGI)
#
#poprzednie_importy <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008) %>%
#  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
#  select(X650,X655,DZ_DZIAL_ID,DZ_NAZWA,ZA_STATUS_IMP) %>%
#  mutate(X650 = str_remove_all(X650,"\\\\7"),
#         X655 = str_remove_all(X655,"\\\\7"),
#         X650 = str_remove_all(str_replace_all(X650,"(\\$a)","\\\\#7\\1"),"#"),
#         X655 = str_remove_all(str_replace_all(X655,"(\\$a)","\\\\#7\\1"),"#")) %>%
#  group_by_at(vars(X650:DZ_NAZWA)) %>%
#  mutate(ZA_STATUS_IMP = paste(ZA_STATUS_IMP,collapse = "|")) %>%
#  ungroup() %>%
#  unique() %>%
#  ungroup() %>%
#  filter(!grepl("\\|",DZ_DZIAL_ID)) %>%
#  filter(grepl("IOK",ZA_STATUS_IMP)) %>%
#  filter(!grepl("INO|IMP|IPN|IPC",ZA_STATUS_IMP)) %>%
#  filter(!grepl("osobowe",DZ_NAZWA)) %>%
#  filter(!(is.na(X650)&is.na(X655))) %>%
#  mutate(ile650 = str_count(X650,"\\|")+1,
#         ile655 = str_count(X655,"\\|")+1) %>%
#  filter(ile650<=10|ile655<=10) %>%
#  select(-ile650,-ile655) %>%
#  mutate(ile_statusow = str_count(ZA_STATUS_IMP,"\\|")+1) %>%
#  arrange(X655,X650,-ile_statusow)
#poprzednie_importy$id_grupy <- cumsum(!duplicated(poprzednie_importy[1:2]))
#poprzednie_importy <- poprzednie_importy[!duplicated(poprzednie_importy$id_grupy),] %>%
#  mutate(id = row_number()) %>%
#  select(-ile_statusow,-id_grupy)
#
#do_dzialowania <- data.frame(id = as.integer(), X650 = as.character(), X655 = as.character(), stringsAsFactors = FALSE)
#x <- 1:length(poprzednie_importy$id)
#for (i in x){
#  progress(match(i,x), max.value = length(x)) 
#    if (is.na(poprzednie_importy$X650[i])&!is.na(poprzednie_importy$X655[i])){
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X655[i],"\\|")), str_count(poprzednie_importy$X655[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = NA,
#               X655 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    } else if (is.na(poprzednie_importy$X655[i])&!is.na(poprzednie_importy$X650[i])){
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X650[i],"\\|")), str_count(poprzednie_importy$X650[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = permutation,
#               X655 = NA,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    } else {
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X650[i],"\\|")), str_count(poprzednie_importy$X650[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650)
#      permutations650 <- data.frame(stringsAsFactors = FALSE)
#      permutations650 <- rbind(permutations650,permutations)
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X655[i],"\\|")), str_count(poprzednie_importy$X655[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X655 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X655)
#      permutations655 <- data.frame(stringsAsFactors = FALSE)
#      permutations655 <- rbind(permutations655,permutations)
#      permutations <- merge(permutations650,permutations655,by = "id",all = TRUE) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    }
#}
#
#do_dzialowania <- do_dzialowania %>%
#  full_join(.,poprzednie_importy %>% select(id,DZ_DZIAL_ID,DZ_NAZWA),by = "id") %>%
#  select(-id)
#do_dzialowania[is.na(do_dzialowania)] <- ""
#####tutaj sprawdzić
#do_dzialowania_przedm <- merge(bn_ok %>% filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"),do_dzialowania, by = c("X650","X655")) %>%
#  select(id,DZ_DZIAL_ID,DZ_NAZWA)
#wczytanie kartotek PBL
redaktorzy_dzialow <- sheets_read(ss = "1Baje-ZfPgAKEDAoDzeo_eCBDrsL7jAXt6ubP2cedbFc", sheet = "redaktorzy_działów") %>%
  select(DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) #%>%
Reading from 'redaktorzy dzia戼㸳昼㸳w'
Range "'redaktorzy_dzia戼㸳昼㸳w'"
New names:
* `` -> ...14
  #mutate(DZ_DZIAL_ID = as.character(DZ_DZIAL_ID))

PBL_dzialy <- dbReadTable(PBL,'PBL_DZIALY') %>%
  select(1,3,6)
Note: method with signature 㤼㸱DBIConnection#character㤼㸲 chosen for function 㤼㸱dbReadTable㤼㸲,
 target signature 㤼㸱JDBCConnection#character㤼㸲.
 "JDBCConnection#ANY" would also be valid
PBL_dzialy_path <- merge(x = PBL_dzialy, y = PBL_dzialy, by.x = "DZ_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- PBL_dzialy_path %>%
  select(-length(PBL_dzialy_path)) %>%
  filter(DZ_DZIAL_ID!=0) %>%
  select(6,7,5,8,4,9,3,10,2,11,1,12) %>%
  unique()

PBL_dz_osob <- PBL_dzialy_path %>%
  filter(grepl("osobowe", DZ_NAZWA)|grepl("osobowe", NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_NAD_NAD_DZ_NAZWA)) %>%
  select(1,2,3,4,5,6,7,8) %>%
  filter(DZ_DZIAL_ID!=148)

PBL_dz_osob_1 <- PBL_dz_osob %>%
  select(1,2,3,4)
PBL_dz_osob_2 <- PBL_dz_osob %>%
  select(1,2,5,6)
PBL_dz_osob_3 <- PBL_dz_osob %>%
  select(1,2,7,8)
colnames(PBL_dz_osob_2) <- c(names(PBL_dz_osob_1))
colnames(PBL_dz_osob_3) <- c(names(PBL_dz_osob_1))
PBL_dz_osob <- rbind(PBL_dz_osob_1,PBL_dz_osob_2,PBL_dz_osob_3) %>%
  filter(!is.na(NAD_DZ_DZIAL_ID)) %>%
  unique()
PBL_dz_osob <- rbind(PBL_dz_osob, c("15043", "Hasła osobowe(luksemburska)","15043", "Hasła osobowe(luksemburska)"), c("430", "Hasła osobowe (Ludzie teatru i filmu)","430", "Hasła osobowe (Ludzie teatru i filmu)"))
PBL_dz_osob_bez_teatru <- PBL_dz_osob %>%
  filter(DZ_DZIAL_ID!=430)

PBL_tworcy <- dbReadTable(PBL,'PBL_TWORCY')
tw_i_dz_podm <- merge(x=PBL_tworcy,y=PBL_dz_osob_bez_teatru, by.x = "TW_DZ_DZIAL_ID", by.y = "NAD_DZ_DZIAL_ID", all.x = TRUE) %>%
  arrange(TW_TWORCA_ID)

tw_i_dz_podm <- data.frame(tw_i_dz_podm, pol_osob = ifelse(tw_i_dz_podm$TW_DZ_DZIAL_ID == 148 & substr(tw_i_dz_podm$TW_NAZWISKO,1,1)==str_sub(tw_i_dz_podm$DZ_NAZWA,nchar(as.character(tw_i_dz_podm$DZ_NAZWA)),nchar(as.character(tw_i_dz_podm$DZ_NAZWA))),TRUE,FALSE), pol = ifelse(tw_i_dz_podm$TW_DZ_DZIAL_ID == 148, TRUE, FALSE)) %>%
  filter(pol_osob == TRUE | pol == FALSE)
PBL_tworcy_podm <- tw_i_dz_podm %>%
  select(TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, TW_NAZW_WLASCIWE, TW_PSEUDONIMY, TW_DATA_URODZIN, TW_DATA_ZGONU, TW_ROCZNIKI_PBL, TW_SLOWA_KLUCZOWE, TW_UWAGI, TW_ROK_URODZIN, TW_ROK_ZGONU, TW_LICZBA_ZAPISOW, TW_ADNOTACJE, TW_TRANSLITERACJE) %>%
  filter(!is.na(DZ_DZIAL_ID))
colnames(PBL_tworcy_podm) <- c("TW_TWORCA_ID", "TW_NAZWISKO", "TW_IMIE", "TW_DZ_DZIAL_ID", "DZ_NAZWA", "TW_NAZW_WLASCIWE", "TW_PSEUDONIMY", "TW_DATA_URODZIN", "TW_DATA_ZGONU", "TW_ROCZNIKI_PBL", "TW_SLOWA_KLUCZOWE", "TW_UWAGI", "TW_ROK_URODZIN", "TW_ROK_ZGONU", "TW_LICZBA_ZAPISOW", "TW_ADNOTACJE", "TW_TRANSLITERACJE")
PBL_tworcy_podm <- PBL_tworcy_podm %>%
  mutate(nazwa = ifelse(is.na(TW_IMIE),as.character(TW_NAZWISKO),paste(TW_NAZWISKO,TW_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", ""))

tw_i_dz <- merge(x=PBL_tworcy,y=PBL_dz_osob, by.x = "TW_DZ_DZIAL_ID", by.y = "NAD_DZ_DZIAL_ID", all.x = TRUE) %>%
  arrange(TW_TWORCA_ID)
tw_i_dz <- data.frame(tw_i_dz, pol_osob = ifelse(tw_i_dz$TW_DZ_DZIAL_ID == 148 & substr(tw_i_dz$TW_NAZWISKO,1,1)==str_sub(tw_i_dz$DZ_NAZWA,nchar(as.character(tw_i_dz$DZ_NAZWA)),nchar(as.character(tw_i_dz$DZ_NAZWA))),TRUE,FALSE), pol = ifelse(tw_i_dz$TW_DZ_DZIAL_ID == 148, TRUE, FALSE)) %>%
  filter(pol_osob == TRUE | pol == FALSE)
PBL_tworcy <- tw_i_dz %>%
  select(TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, TW_NAZW_WLASCIWE, TW_PSEUDONIMY, TW_DATA_URODZIN, TW_DATA_ZGONU, TW_ROCZNIKI_PBL, TW_SLOWA_KLUCZOWE, TW_UWAGI, TW_ROK_URODZIN, TW_ROK_ZGONU, TW_LICZBA_ZAPISOW, TW_ADNOTACJE, TW_TRANSLITERACJE)
colnames(PBL_tworcy) <- c("TW_TWORCA_ID", "TW_NAZWISKO", "TW_IMIE", "TW_DZ_DZIAL_ID", "DZ_NAZWA", "TW_NAZW_WLASCIWE", "TW_PSEUDONIMY", "TW_DATA_URODZIN", "TW_DATA_ZGONU", "TW_ROCZNIKI_PBL", "TW_SLOWA_KLUCZOWE", "TW_UWAGI", "TW_ROK_URODZIN", "TW_ROK_ZGONU", "TW_LICZBA_ZAPISOW", "TW_ADNOTACJE", "TW_TRANSLITERACJE")
PBL_tworcy <- PBL_tworcy %>%
  mutate(nazwa = ifelse(is.na(TW_IMIE),as.character(TW_NAZWISKO),paste(TW_NAZWISKO,TW_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", ""),
         TW_DZ_DZIAL_ID = as.numeric(TW_DZ_DZIAL_ID))

PBL_autorzy <- dbReadTable(PBL,'PBL_AUTORZY') %>%
  mutate(nazwa = ifelse(is.na(AM_IMIE),as.character(AM_NAZWISKO),paste(AM_NAZWISKO,AM_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", "")) %>%
  filter(nazwa != "nana")

PBL_autor_to_tworca <- sheets_read(ss = "1RuyR3pZl4vNLprIqAWgiWfvG8EJhYGcLWb24J7VwrvA", sheet = "Arkusz1")
Reading from 'import_pbl_autor_to_tworca'
Range "'Arkusz1'"
PBL_wspoltworcy <- dbReadTable(PBL,'PBL_OSOBY') %>%
  mutate(nazwa_prosta = str_replace_all(str_to_lower(ifelse(is.na(OS_IMIE),as.character(OS_NAZWISKO),paste(OS_NAZWISKO,OS_IMIE, sep = ""))), "\\W", "")) %>%
  filter(nazwa_prosta !="nana")

PBL_funkcje <- sheets_read(ss = "1htn_L6REs3GdG1xSiGHIfr6MJvjmmU_kVGxiMZtCV24", sheet = "Arkusz1")
Reading from 'import_pbl_funkcje'
Range "'Arkusz1'"
PBL_wydawnictwa <- dbReadTable(PBL,'PBL_WYDAWNICTWA') %>%
  mutate(nazwa_prosta = str_replace_all(str_to_lower(paste(WY_MIASTO, WY_NAZWA)), "\\W", "")) %>%
  filter(nazwa_prosta !="nana")

PBL_rodzaje_zapisow <- dbReadTable(PBL,'PBL_RODZAJE_ZAPISOW')

BN_PBL_lista_literatur <- sheets_read(ss = "1zbwjnrtWGvbjrQTLMavJcWSu7HfP0I-USNgZ_KWiXjc", sheet = "lista ukd bn") %>%
  filter(!is.na(ukd_ogolne)) %>%
  select(3:9) %>%
  cSplit(.,c("pbl_id","pbl_nazwa","redaktor_dzialu","pbl_id_literatury","pbl_literatura"),sep = "|",direction = "long") %>%
  filter(!is.na(pbl_id))
Reading from 'lista_UKD_literatury'
Range "'lista ukd bn'"
PBL_hasla_osobowe <- sheets_read(ss = "1zbwjnrtWGvbjrQTLMavJcWSu7HfP0I-USNgZ_KWiXjc", sheet = "pbl_hasla_osobowe") %>%
  select(2:5)
Reading from 'lista_UKD_literatury'
Range "'pbl_hasla_osobowe'"
New names:
* nazwa -> nazwa...1
* nazwa -> nazwa...5
colnames(PBL_hasla_osobowe) <- c("DZ_DZIAL_ID","DZ_NAZWA","redaktor_dzialu","nazwa")
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa")
###przypisanie redaktora na podstawie osoby z 600 jako tematu - książki o twórcy
#600
marc_field_600 <- przedmiotowa_redaktorzy %>%
  select(id,X600)%>%
  filter(X600!="") %>%
  mutate(X600=str_replace_all(X600,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X600",sep = "~",direction = "long") %>%
  filter(X600!="") %>%
  mutate(X600=str_remove_all(X600,"^\\|")) %>%
  mutate(indicator = str_replace_all(X600,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X600,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_600)[1]))
colnames(empty_table) <-subfield_list
marc_field_600<-cbind(marc_field_600,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_600$X600 <- str_replace(marc_field_600$X600,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_600[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_600$X600),str_replace_all(gsub(string,"\\3",marc_field_600$X600),"\\${2}.", "~"),NA)
}
marc_field_600 <- marc_field_600 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))

marc_field_600 <- marc_field_600 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  left_join(.,PBL_tworcy,by = c("pbl_id"="TW_TWORCA_ID")) %>%
  left_join(.,redaktorzy_dzialow,by = c("TW_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(id,TW_TWORCA_ID=pbl_id,TW_NAZWISKO,TW_IMIE,TW_DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu)
count <- as.data.frame(table(marc_field_600$id))
marc_field_600 <- merge(marc_field_600,count,by.x = "id", by.y = "Var1") %>%
  filter(Freq<2) %>%
  select(-Freq) %>%
  rename(DZ_DZIAL_ID=TW_DZ_DZIAL_ID) %>%
  mutate(RZ_RODZAJ_ID = 2,
         RZ_NAZWA = "książka o twórcy (przedmiotowa)")

###przypisanie do redaktorów na podstawie literatury z pola 655
`%notin%` <- Negate(`%in%`)
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(id %notin% marc_field_600$id)

#655
marc_field_655 <- przedmiotowa_redaktorzy %>%
  select(id,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(id,`$a`) %>%
  unique()

PBL_literatury_obce <- PBL_dzialy_path %>%
  filter(NAD_DZ_DZIAL_ID==30) %>%
  select(1,2) %>%
  left_join(.,redaktorzy_dzialow,by = "DZ_DZIAL_ID") %>%
  filter(!is.na(redaktor_dzialu)) %>%
  select(1,DZ_NAZWA = 2,4) %>%
  mutate(nazwa = substr(str_replace(DZ_NAZWA, "(.*?)( )(.*?)","\\3"),1,nchar(str_replace(DZ_NAZWA, "(.*?)( )(.*?)","\\3"))-1),
         nazwa = ifelse(nazwa=="romska (cygańska","romsk|cygańsk",as.character(nazwa)))

reczne <- data.frame(DZ_DZIAL_ID = c(32,32,32,32,59,86,107,149,67,69,34,34,34,34,34,55,32,99,34),DZ_NAZWA = c("Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura grecka starożytna","Literatura łacińska średniowieczna","Literatura syryjska","Literatura esperanto","Literatura holenderska","Literatury Indii","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej", "Literatura egipsko-arabska", "Literatura brytyjska i irlandzka","Literatura palestyńsko-arabska","Literatury Afryki Subsaharyjskiej"), redaktor_dzialu = c("BEATAK","BEATAK","BEATAK","BEATAK","BEATAS","BEATAS","BEATAD","CEZARY","TOMASZU","EWA","EWA","EWA","EWA","EWA","EWA","BEATAD","BEATAK","BEATAD","EWA"), nazwa = c("angielsk","szkock","irlandzk","walijsk","greck","łacińsk","syryjsk","esperanck","niderlandzk","indyjsk","południowoafryka","senegalsk","nigeryjsk","afrykańsk","ruandyjsk","egipsk. nowożytn","celtyck","palestyńsk","somalijsk"))

PBL_literatury_obce <- rbind(PBL_literatury_obce,reczne)

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_literatury_obce b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(id,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
marc_field_655 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(id,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
###przypisanie do redaktorów na podstawie literatury z pola 650
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(id %notin% marc_field_600$id) %>%
  filter(id %notin% marc_field_655$id)

#650
marc_field_650 <- przedmiotowa_redaktorzy %>%
  select(id,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(id,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_literatury_obce b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(id,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
marc_field_650 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(id,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))

do_przedmiotowej1 <- rbind(marc_field_600,marc_field_655,marc_field_650)

#przypisanie na podstawie deskryptorów tematycznych z 650 i 655
zapisy <- RJDBC::dbGetQuery(PBL,
                            "select z.za_zapis_id, dz.dz_dzial_id, dz.dz_nazwa, rz.rz_rodzaj_id, rz.rz_nazwa, z.za_status_imp, z.za_uwagi
                            from pbl_zapisy z
                            join pbl_dzialy dz on dz.dz_dzial_id=z.za_dz_dzial1_id
                            join pbl_rodzaje_zapisow rz on rz.rz_rodzaj_id=z.za_rz_rodzaj1_id
                            where z.za_uwagi like '%import%'") %>%
  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
  select(-ZA_UWAGI)
nazwy_lit_obcych <- str_replace_all(paste(PBL_literatury_obce$nazwa,collapse = "|"),"\\(","\\\\(")
poprzednie_importy <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(ZA_ZAPIS_ID,X650,X655,DZ_DZIAL_ID,DZ_NAZWA,RZ_RODZAJ_ID,RZ_NAZWA,pracownik_pbl,ZA_STATUS_IMP) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7"),
         X655 = str_remove_all(X655,"\\\\7"),
         X650 = str_remove_all(str_replace_all(X650,"(\\$a)","\\\\#7\\1"),"#"),
         X655 = str_remove_all(str_replace_all(X655,"(\\$a)","\\\\#7\\1"),"#")) %>%
  unique() %>%
  filter(RZ_RODZAJ_ID %notin% c(0,1,2,250,764)) %>%
  arrange(pracownik_pbl,DZ_DZIAL_ID) %>%
  filter(!grepl(nazwy_lit_obcych,X650)&!grepl(nazwy_lit_obcych,X655)) %>%
  filter(!is.na(pracownik_pbl)) %>%
  filter(ZA_STATUS_IMP %in% c("IOK","IPC"))

#przypisanie na podstawie częstotliwości deskryptorów 655
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(id %notin% do_przedmiotowej1$id)

deskryptory655 <- poprzednie_importy %>%
  select(X655,pracownik_pbl,DZ_DZIAL_ID,DZ_NAZWA) %>%
  filter(!is.na(X655)) %>%
  unite(data=.,col = "deskryptor655", sep = "~")

deskryptory655 <- as.data.frame(table(deskryptory655$deskryptor655)) %>%
  cSplit(.,"Var1",sep = "~",direction = "wide") %>%
  rename(X655 = Var1_1,
         redaktor_dzialu = Var1_2,
         DZ_DZIAL_ID = Var1_3,
         DZ_NAZWA = Var1_4) %>%
  mutate(X655 = str_remove_all(X655,"\\\\7\\$a"),
         X655 = str_remove_all(X655,"\\$2DBN"),
         X655 = str_replace_all(X655,"\\$.|\\|"," "),
         X655 = str_replace_all(X655," ",".*")) %>%
  arrange(X655,-Freq,DZ_NAZWA)

deskryptory655$id_grupy <- cumsum(!duplicated(deskryptory655[2]))
deskryptory655 <- deskryptory655[!duplicated(deskryptory655$id_grupy),] %>%
  select(-id_grupy) %>%
  arrange(-Freq)

x <- 1:length(deskryptory655$X655)
test <- data.frame(stringsAsFactors = FALSE)
for (i in x) {
  progress(match(i,x), max.value = length(x))
    do_przedmiotowej2 <- przedmiotowa_redaktorzy %>%
      mutate(redaktor_dzialu = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$redaktor_dzialu)[i],NA),
             ile = ifelse(grepl(deskryptory655$X655[i],X655),as.integer(deskryptory655$Freq)[i],NA),
             co = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$X655)[i],NA),
             DZ_DZIAL_ID = ifelse(grepl(deskryptory655$X655[i],X655),as.integer(deskryptory655$DZ_DZIAL_ID)[i],NA),
             DZ_NAZWA = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$DZ_NAZWA)[i],NA)) %>%
      filter(!is.na(redaktor_dzialu))
    if (length(do_przedmiotowej2$redaktor_dzialu)>0) {
      test <- rbind(test,do_przedmiotowej2)
    } else {}
    
}
count <- as.data.frame(table(test$id))
do_przedmiotowej2 <- merge(test,count, by.x = "id",by.y = "Var1") %>%
  mutate(dlugosc = nchar(co)) %>%
  arrange(-Freq,id,-dlugosc,-ile)

do_przedmiotowej2$id_grupy <- cumsum(!duplicated(do_przedmiotowej2[1]))
do_przedmiotowej2 <- do_przedmiotowej2[!duplicated(do_przedmiotowej2$id_grupy),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_przedmiotowej1))
#przypisanie na podstawie częstotliwości deskryptorów 650
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(id %notin% do_przedmiotowej1$id) %>%
  filter(id %notin% do_przedmiotowej2$id)

deskryptory650 <- poprzednie_importy %>%
  select(X650,pracownik_pbl,DZ_DZIAL_ID,DZ_NAZWA) %>%
  filter(!is.na(X650)) %>%
  unite(data=.,col = "deskryptor650", sep = "~")

deskryptory650 <- as.data.frame(table(deskryptory650$deskryptor650)) %>%
  cSplit(.,"Var1",sep = "~",direction = "wide") %>%
  rename(X650 = Var1_1,
         redaktor_dzialu = Var1_2,
         DZ_DZIAL_ID = Var1_3,
         DZ_NAZWA = Var1_4) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7\\$a"),
         X650 = str_remove_all(X650,"\\$2DBN"),
         X650 = str_remove_all(X650,"\\\\\\\\"),
         X650 = str_replace_all(X650,"\\$.|\\|"," "),
         X650 = str_replace_all(X650," ",".*")) %>%
  arrange(X650,-Freq,DZ_NAZWA)

deskryptory650$id_grupy <- cumsum(!duplicated(deskryptory650[2]))
deskryptory650 <- deskryptory650[!duplicated(deskryptory650$id_grupy),] %>%
  select(-id_grupy) %>%
  arrange(-Freq)

x <- 1:length(deskryptory650$X650)
test <- data.frame(stringsAsFactors = FALSE)
for (i in x) {
  progress(match(i,x), max.value = length(x))
    do_przedmiotowej3 <- przedmiotowa_redaktorzy %>%
      mutate(redaktor_dzialu = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$redaktor_dzialu)[i],NA),
             ile = ifelse(grepl(deskryptory650$X650[i],X650),as.integer(deskryptory650$Freq)[i],NA),
             co = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$X650)[i],NA),
             DZ_DZIAL_ID = ifelse(grepl(deskryptory650$X650[i],X650),as.integer(deskryptory650$DZ_DZIAL_ID)[i],NA),
             DZ_NAZWA = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$DZ_NAZWA)[i],NA)) %>%
      filter(!is.na(redaktor_dzialu))
    if (length(do_przedmiotowej3$redaktor_dzialu)>0) {
      test <- rbind(test,do_przedmiotowej3)
    } else {}
    
}
count <- as.data.frame(table(test$id))
do_przedmiotowej3 <- merge(test,count, by.x = "id",by.y = "Var1") %>%
  mutate(dlugosc = nchar(co)) %>%
  arrange(-Freq,id,-dlugosc,-ile)

do_przedmiotowej3$id_grupy <- cumsum(!duplicated(do_przedmiotowej3[1]))
do_przedmiotowej3 <- do_przedmiotowej3[!duplicated(do_przedmiotowej3$id_grupy),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_przedmiotowej1))

do_przedmiotowej <- rbind(do_przedmiotowej1,do_przedmiotowej2,do_przedmiotowej3)
#przypisanie przedmiotowej na podstawie słownika pojęć
do_przedmiotowej <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  left_join(.,do_przedmiotowej,by="id") %>%
#przypisanie na podstawie zdefiniowanych słów (dopisanie do gotowego pliku)
  mutate(redaktor_dzialu = ifelse(is.na(redaktor_dzialu),
                                  ifelse(grepl("teatr",X655,ignore.case = TRUE)|grepl("teatr",X650,ignore.case = TRUE),"MARTAK",
                                         ifelse(grepl("film",X655,ignore.case = TRUE)|grepl("film",X650,ignore.case = TRUE),"OLA",
                                                    ifelse(grepl("telewizj",X655,ignore.case = TRUE)|grepl("telewizj",X650,ignore.case = TRUE),"EWA",
                                                           ifelse(grepl("radio",X655,ignore.case = TRUE)|grepl("radio",X650,ignore.case = TRUE),"EWA",
                                                                  ifelse(grepl("czasopism",X655,ignore.case = TRUE)|grepl("czasopism",X650,ignore.case = TRUE),"TOMASZ",
                                                                         ifelse(grepl("wydawnictw",X655,ignore.case = TRUE)|grepl("wydawnictw",X650,ignore.case = TRUE),"BARBARAW",
                                                                                ifelse(grepl("od 1989",X655,ignore.case = TRUE)|grepl("od 1989",X650,ignore.case = TRUE),"PAULINA",
                                                                                       ifelse(grepl("ćwicze|zadan|szkoł|szkół|scenariusz|zajęć|pomocnicz",X655,ignore.case = TRUE)|grepl("ćwicze|zadan|szkoł|szkół|scenariusz|zajęć|pomocnicz",X650,ignore.case = TRUE),"KAROLINA",
                                                                                              ifelse(grepl("sceniczn",X655,ignore.case = TRUE)|grepl("sceniczn",X650,ignore.case = TRUE),"MARTAK",
                                                                                                     ifelse(grepl("teoria|socjologia|antropologia|metafizyk|interpretac|filozof",X655,ignore.case = TRUE)|grepl("teoria|socjologia|antropologia|metafizyk|interpretac|filozof",X650,ignore.case = TRUE),"PAULINA",
                                                                                                            ifelse(grepl("ludow|zwycz|obycz|folkl",X655,ignore.case = TRUE)|grepl("ludow|zwycz|obycz|folkl",X650,ignore.case = TRUE),"ANIA",
                                                                                                                   ifelse(grepl("katolic|biblia|biblij|kościół",X655,ignore.case = TRUE)|grepl("katolic|biblia|biblij|kościół",X650,ignore.case = TRUE),"BEATAS",
                                                                                                                          ifelse(grepl("druk|rękopi|inkunab|inwent|bibliogr|słownik|bibliotek",X655,ignore.case = TRUE)|grepl("druk|rękopi|inkunab|inwent|bibliogr|słownik|bibliotek",X650,ignore.case = TRUE),"IZA",
                                                                                                                                 ifelse(grepl("zabawk|dziec",X655,ignore.case = TRUE)|grepl("zabawk|dziec",X650,ignore.case = TRUE),"BARBARAW",
                                                                                                                                        ifelse(grepl("tematyka|20-21 w.|21 w.",X655,ignore.case = TRUE)|grepl("tematyka|20-21 w.|21 w.",X650,ignore.case = TRUE),"PAULINA",
                                                                                                                                               ifelse(grepl("19|18|17|16|15|14|13",X655,ignore.case = TRUE)|grepl("19|18|17|16|15|14|13",X650,ignore.case = TRUE),"GOSIA",
                                                                                                                                                      ifelse(grepl("polityk",X655,X655,ignore.case = TRUE)|grepl("polityk",X650,X655,ignore.case = TRUE),"PAULINA",
                                                                                                                                                             ifelse(grepl("historia",X655,X655,ignore.case = TRUE)|grepl("historia",X650,X655,ignore.case = TRUE),"GOSIA",NA)))))))))))))))))),as.character(redaktor_dzialu)),
         RZ_RODZAJ_ID = ifelse(is.na(RZ_RODZAJ_ID),21,as.integer(RZ_RODZAJ_ID)),
         RZ_NAZWA = ifelse(is.na(RZ_NAZWA),"książka w haśle rzeczowym",as.character(RZ_NAZWA))) %>%
  select(names(do_przedmiotowej1)) %>%
  filter(!is.na(redaktor_dzialu))
#wydobycie zbioru, który ciągle nie ma przypisanych redaktorów do przedmiotowej
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(id %notin% do_przedmiotowej$id)
#dla książek, które mają kilku autorów w osoba_bn_temat - przypisanie do redaktora powszechnej - BEATAD?
do_przedmiotowej4 <- przedmiotowa_redaktorzy %>%
  filter(!is.na(osoba_bn_temat)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "BEATAD") %>%
  select(names(do_przedmiotowej1))
#dla książek, które nie mają wypełnionego osoba_bn_autor - przypisanie do Marty z x? czy losowo do kogoś?
do_przedmiotowej5 <- przedmiotowa_redaktorzy %>%
  filter(is.na(osoba_bn_autor)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "MARTAKx") %>%
  select(names(do_przedmiotowej1))
#połaczenie wszystkich przedmiotowych z przypisanymi redaktorami w jeden plik
do_przedmiotowej <- rbind(do_przedmiotowej,do_przedmiotowej4,do_przedmiotowej5)
#dla książek, które mają wypełnione osoba_bn_autor - zmiana na podmiotową do ręcznego przejrzenia i przypisanie redaktorów
###przypisanie do podmiotowej!!!!!!!!!!!!!!!!!!!###############
do_podmiotowej1 <- przedmiotowa_redaktorzy %>%
  filter(!is.na(osoba_bn_autor))
#trzeba zaktualizować w bn_ok, że teraz to są podmiotowe
#lista rekordów do przepisania z przedmiotowej na podmiotową
lista_do_przepisania <- do_podmiotowej1$id
bn_ok$rodzaj_ksiazki[bn_ok$id %in% lista_do_przepisania] <- "podmiotowa"
#przetworzenie całej podmiotowej (bo plik do_podmiotowej1 już jest w środku)
#przypisanie podmiotowej anonimowej
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="")

#655
marc_field_655 <- podmiotowa_redaktorzy %>%
  select(id,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(id,`$a`) %>%
  unique()
trim <- function (x) gsub("^\\s+|\\s+$", "", x)
PBL_literatury_anonimowe <- PBL_dzialy_path %>%
  filter(grepl("Utwory anonim",DZ_NAZWA)) %>%
  select(DZ_DZIAL_ID,DZ_NAZWA,NAD_NAD_DZ_DZIAL_ID) %>%
  left_join(.,redaktorzy_dzialow,by = c("NAD_NAD_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(1,DZ_NAZWA = 2,5) %>%
  filter(DZ_DZIAL_ID %notin% c(1922,1983)) %>%
  group_by(DZ_DZIAL_ID) %>%
  mutate(nazwa = paste(trim(unlist(str_extract_all(DZ_NAZWA,"(?<=\\()(.*?)(?=\\(|\\))"))),collapse = "|"),
         nazwa = str_remove_all(nazwa,"(.)(?=\\||$)"),
         nazwa = str_remove(nazwa,"literatur. "),
         nazwa = ifelse(nazwa=="","polsk",as.character(nazwa)),
         redaktor_dzialu = ifelse(is.na(redaktor_dzialu),"ANIA",as.character(redaktor_dzialu))) %>%
  ungroup()

reczne <- data.frame(DZ_DZIAL_ID = c(899,694,694,1174,145,1220),DZ_NAZWA = c("Utwory anonimowe (Indii)","Utwory anonimowe (brytyjska i irlandzka)","Utwory anonimowe (brytyjska i irlandzka)","Utwory anonimowe (starosłowiańska)","Utwory anonimowe i ulotne","Utwory anonimowe (turecka)"), redaktor_dzialu = c("EWA","BEATAK","BEATAK","BEATAD","ANIA","EWA"), nazwa = c("indyjsk","walijsk","angielsk","starorusk","kaszubsk","nogajsk"))

PBL_literatury_anonimowe <- rbind(PBL_literatury_anonimowe,reczne)

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_literatury_anonimowe b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(id,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
marc_field_655 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(id,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
###przypisanie do redaktorów literatury anonimowej na podstawie literatury z pola 650
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="") %>%
  filter(id %notin% marc_field_655$id)

#650
marc_field_650 <- podmiotowa_redaktorzy %>%
  select(id,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(id,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_literatury_anonimowe b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(id,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
marc_field_650 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(id,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
do_podmiotowej1 <- rbind(marc_field_655,marc_field_650)
#co zrobić z pozostałymi podmiotowymi anonimowymi, których nie udało się przypisać?
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="") %>%
  filter(id %notin% do_podmiotowej1$id) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "KAROLINA") %>%
  select(names(do_przedmiotowej1))
do_podmiotowej1 <- rbind(do_podmiotowej1,podmiotowa_redaktorzy)
###przypisanie redaktora na podstawie osoby z 100 jako twórcy (autora) - książki twórcy
#100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(id %notin% do_podmiotowej1$id)

marc_field_100 <- podmiotowa_redaktorzy %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
marc_field_100 <- marc_field_100 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1")) %>%
  group_by(id) %>%
  mutate(name = paste(name,collapse = "|")) %>%
  ungroup() %>%
  unique()

do_podmiotowej2 <- marc_field_100 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  left_join(.,PBL_tworcy,by = c("pbl_id"="TW_TWORCA_ID")) %>%
  left_join(.,redaktorzy_dzialow,by = c("TW_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(id,TW_TWORCA_ID=pbl_id,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  unique()

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie kodu literatury z pola X080 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(id %notin% do_podmiotowej1$id) %>%
  filter(id %notin% do_podmiotowej2$id)

podmiotowa_redaktorzy <- sqldf("select *
                            from podmiotowa_redaktorzy a
                            join BN_PBL_lista_literatur b on a.X080 like ('%'||b.ukd_ogolne||'%')")

###dodawanie nazewnictw nowych twórców
#100
marc_field_100 <- podmiotowa_redaktorzy %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

marc_field_100 <- marc_field_100 %>%
  select(id,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  group_by(id) %>%
  mutate(`$a` = paste(`$a`,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(TW_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         TW_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(id,TW_NAZWISKO,TW_IMIE)
#join na podstawie identycznego id
podmiotowa_redaktorzy <- podmiotowa_redaktorzy %>%
  left_join(.,marc_field_100,by="id") %>%
  mutate(pbl_nazwa = as.character(pbl_nazwa)) %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa_prosta=="polsk"&substr(pbl_nazwa,nchar(pbl_nazwa),nchar(pbl_nazwa))!=substr(TW_NAZWISKO,1,1),NA,as.integer(pbl_id))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(id,DZ_DZIAL_ID)

count <- as.data.frame(table(podmiotowa_redaktorzy$id))
podmiotowa_redaktorzy <- merge(podmiotowa_redaktorzy,count,by.x = "id",by.y = "Var1") %>%
  mutate(dlugosc = nchar(ukd_ogolne)) %>%
  arrange(-Freq,id,-dlugosc,pbl_id)
podmiotowa_redaktorzy$same <- cumsum(!duplicated(podmiotowa_redaktorzy[1]))
do_podmiotowej3 <- podmiotowa_redaktorzy[!duplicated(podmiotowa_redaktorzy$same),] %>%
  mutate(TW_TWORCA_ID = NA) %>%
  rename(DZ_NAZWA = pbl_nazwa) %>%
  select(id,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)")

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 655 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(id %notin% do_podmiotowej1$id) %>%
  filter(id %notin% do_podmiotowej2$id) %>%
  filter(id %notin% do_podmiotowej3$id)

#655
marc_field_655 <- podmiotowa_redaktorzy %>%
  select(id,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(id,`$a`) %>%
  unique()

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")

###dodawanie nazewnictw nowych twórców
#100
marc_field_100 <- podmiotowa_redaktorzy %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

marc_field_100 <- marc_field_100 %>%
  select(id,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  group_by(id) %>%
  mutate(`$a` = paste(`$a`,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(TW_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         TW_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(id,TW_NAZWISKO,TW_IMIE)
#join na podstawie identycznego id
marc_field_655 <- marc_field_655 %>%
  left_join(.,marc_field_100,by="id") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(TW_NAZWISKO,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(id,DZ_DZIAL_ID)
    
marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
do_podmiotowej4 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(id,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO,TW_IMIE,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(marc_field_600))

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 655 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(id %notin% do_podmiotowej1$id) %>%
  filter(id %notin% do_podmiotowej2$id) %>%
  filter(id %notin% do_podmiotowej3$id) %>%
  filter(id %notin% do_podmiotowej4$id)

#650
marc_field_650 <- podmiotowa_redaktorzy %>%
  select(id,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(id,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")  %>%
  left_join(.,marc_field_100,by="id") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(TW_NAZWISKO,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(id,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
do_podmiotowej5 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(id,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO,TW_IMIE,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(marc_field_600))
#co zostało do podmiotowej?
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(id %notin% do_podmiotowej1$id) %>%
  filter(id %notin% do_podmiotowej2$id) %>%
  filter(id %notin% do_podmiotowej3$id) %>%
  filter(id %notin% do_podmiotowej4$id) %>%
  filter(id %notin% do_podmiotowej5$id)
#naddatek przypisać Karolinie jako podmiotową bez twórców i czy_automatycznie <- nie
do_podmiotowej6 <- podmiotowa_redaktorzy %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)",
         redaktor_dzialu = "KAROLINA") %>%
  select(names(do_podmiotowej5))
#trzeba zaktualizować w bn_ok, że teraz to nie są automatyczne
lista_do_przepisania <- do_podmiotowej6$id
bn_ok$czy_automatycznie[bn_ok$id %in% lista_do_przepisania] <- "nie"
#połączenie przydziału podmiotowych w jeden plik
do_podmiotowej <- rbind(do_podmiotowej1,do_podmiotowej2,do_podmiotowej3,do_podmiotowej4,do_podmiotowej5,do_podmiotowej6)

#przypisanie antologii do Tomka i do literatur na podstawie 080
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia")
PBL_dzialy_antologie <- PBL_dzialy_path %>%
  filter(grepl("antolog",DZ_NAZWA,ignore.case = TRUE)) %>%
  left_join(.,redaktorzy_dzialow,by="DZ_DZIAL_ID") %>%
  select(DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu) %>%
  mutate(redaktor_dzialu = ifelse(is.na(redaktor_dzialu),"TOMASZ",as.character(redaktor_dzialu)))

PBL_dzialy_antologie <- sqldf("select *
                            from PBL_dzialy_antologie a
                            left join BN_PBL_lista_literatur b on a.DZ_NAZWA like ('%'||b.nazwa_prosta||'%')") %>%
  mutate(ukd_ogolne = ifelse(DZ_DZIAL_ID==146,"821.162.1",as.character(ukd_ogolne)),
         nazwa_prosta = ifelse(DZ_DZIAL_ID==146,"polsk",as.character(nazwa_prosta))) %>%
  filter(!is.na(ukd_ogolne)) %>%
  filter(DZ_DZIAL_ID!=744) %>%
  select(1:5) 

antologie_redaktorzy <- sqldf("select *
                            from antologie_redaktorzy a
                            join PBL_dzialy_antologie b on a.X080 like ('%'||b.ukd_ogolne||'%')")

count <- as.data.frame(table(antologie_redaktorzy$id))
antologie_redaktorzy <- merge(antologie_redaktorzy,count,by.x = "id",by.y = "Var1") %>%
  mutate(dlugosc = nchar(ukd_ogolne)) %>%
  arrange(-Freq,id,-dlugosc,DZ_DZIAL_ID)
antologie_redaktorzy$same <- cumsum(!duplicated(antologie_redaktorzy[1]))
do_antologii1 <- antologie_redaktorzy[!duplicated(antologie_redaktorzy$same),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA) %>%
  select(id,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym")
#przypisanie antologii do Tomka i do literatur na podstawie 665
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(id %notin% do_antologii1$id)

marc_field_655 <- antologie_redaktorzy %>%
  select(id,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(antologie_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(id,`$a`) %>%
  unique()

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_dzialy_antologie b on a.`$a` like ('%'||b.nazwa_prosta||'%')") %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(id,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
do_antologii2 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(id,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_antologii1))
#przypisanie antologii do Tomka i do literatur na podstawie 665
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(id %notin% do_antologii1$id) %>%
  filter(id %notin% do_antologii2$id)

marc_field_650 <- antologie_redaktorzy %>%
  select(id,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(antologie_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(id,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_dzialy_antologie b on a.`$a` like ('%'||b.nazwa_prosta||'%')") %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(id,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
do_antologii3 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(id,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_antologii1))
#reszta antologii bez działu po prostu przypisana do Tomka
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(id %notin% do_antologii1$id) %>%
  filter(id %notin% do_antologii2$id) %>%
  filter(id %notin% do_antologii3$id)

do_antologii4 <- antologie_redaktorzy %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "TOMASZ") %>%
  select(names(do_antologii1))

do_antologii <- rbind(do_antologii1,do_antologii2,do_antologii3,do_antologii4)
#połączenie przydziałów w jeden plik
redaktorzy_zapisow <- rbind(do_podmiotowej,do_przedmiotowej,do_antologii)
#połączenie przypisania ze zbiorem 
bn_ok <- bn_ok %>%
  left_join(.,redaktorzy_zapisow,by="id") %>%
  mutate(redaktor_dzialu = ifelse(is.na(DZ_NAZWA),as.character(redaktor_dzialu),
                                  ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - B","PAULINA",
                                         ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - G","MARTAK",
                                                ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - L","BEATAK",
                                                       ifelse(DZ_NAZWA=="Literatura współczesna (utwory anonimowe i ulotne)","GOSIA",
                                                              ifelse(DZ_NAZWA=="Utwory anonimowe i ulotne","GOSIA",
                                                                     ifelse(DZ_NAZWA=="Utwory anonimowe i ulotne (epoka nieznana)","GOSIA",
                                                                            ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - N","GOSIA",
                                                                                   ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - O","GOSIA",
                                                                                          ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - Q","GOSIA",
                                                                                                 ifelse(DZ_NAZWA=="Literatura brytyjska i irlandzka","EWA",
                                                                                                        ifelse(DZ_NAZWA=="Utwory anonimowe (brytyjska i irlandzka)","EWA",
                                                                                                               ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - U","PAULINA",
                                                                                                                      ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - X","PAULINA",
                                                                                                                             ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - V","PAULINA",
                                                                                                                                    ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - Y","PAULINA",as.character(redaktor_dzialu))))))))))))))))))
bn_ok <- bn_ok %>%
  mutate(ZA_UWAGI = 1:nrow(.))

#ujednolicenie literatury dla kilku zapisów nowego twórcy
kilka_literatur_nowego_tworcy <- bn_ok %>%
  select(id,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(is.na(TW_TWORCA_ID)&!is.na(TW_NAZWISKO)) %>%
  select(-TW_TWORCA_ID) %>%
  arrange(TW_NAZWISKO,TW_IMIE) %>%
  group_by_at(vars(2:3)) %>%
  mutate(unikatowy_dzial = paste(unique(DZ_DZIAL_ID),collapse = "|"),
         DZ_DZIAL_ID = paste(DZ_DZIAL_ID,collapse = "|"),
         DZ_NAZWA = paste(DZ_NAZWA,collapse = "|"),
         redaktor_dzialu = paste(redaktor_dzialu,collapse = "|"),
         id = paste(id,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  filter(grepl("\\|",unikatowy_dzial)) %>%
  select(-unikatowy_dzial) %>%
  mutate(id_grupy = 1:lengths(.)) %>%
  cSplit(.,c("id","DZ_DZIAL_ID","DZ_NAZWA","redaktor_dzialu"),sep = "|",direction = "long")

kilka_literatur_nowego_tworcy[,2:7][duplicated(kilka_literatur_nowego_tworcy$id_grupy),] <- NA
kilka_literatur_nowego_tworcy <- fill_(kilka_literatur_nowego_tworcy, names(kilka_literatur_nowego_tworcy))
#zaktualizowanie zbioru podmiotowych o ujednolicone działy dla nowych twórców
x <- 1:length(kilka_literatur_nowego_tworcy$id)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  bn_ok$DZ_DZIAL_ID[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- kilka_literatur_nowego_tworcy$DZ_DZIAL_ID[i]
  bn_ok$DZ_NAZWA[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- as.character(kilka_literatur_nowego_tworcy$DZ_NAZWA)[i]
  bn_ok$redaktor_dzialu[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- as.character(kilka_literatur_nowego_tworcy$redaktor_dzialu)[i]
}
#jeśli nie ma działu lub rodzaju zapisu, to wpisać id i nazwę do ustalenia
bn_ok <- bn_ok %>%
  mutate(DZ_DZIAL_ID =ifelse(is.na(DZ_DZIAL_ID),0,as.integer(DZ_DZIAL_ID)),
         DZ_NAZWA = ifelse(is.na(DZ_NAZWA),"-- do ustalenia --",as.character(DZ_NAZWA)),
         RZ_RODZAJ_ID =ifelse(is.na(RZ_RODZAJ_ID),0,as.integer(RZ_RODZAJ_ID)),
         RZ_NAZWA = ifelse(is.na(RZ_NAZWA),"-- do ustalenia --",as.character(RZ_NAZWA)))
test <- bn_ok %>%
  filter(pracownik == "NA_podm")
BŁĄD: nie znaleziono obiektu 'pracownik'
Dodatkowo: Było 18 ostrzeżenie (użyj 'warnings()' aby je zobaczyć)
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_podm",sep = ""))

#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- BN_autor %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
#pole 245
marc_field_245 <- BN_autor %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
BN_autor <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  unique() %>%
  mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  unique() %>%
  mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE, X245c = `$c`)
  
x <- 1:lengths(BN_autor[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_autor$czy_nazwisko[i] <- grepl(BN_autor$AM_NAZWISKO[i],BN_autor$X245c[i])
  BN_autor$czy_imie[i] <- grepl(BN_autor$AM_IMIE[i],BN_autor$X245c[i])
}
Progress:    1 on 7353  Progress:    2 on 7353  Progress:    3 on 7353  Progress:    4 on 7353  Progress:    5 on 7353  Progress:    6 on 7353  Progress:    7 on 7353  Progress:    8 on 7353  Progress:    9 on 7353  Progress:   10 on 7353  Progress:   11 on 7353  Progress:   12 on 7353  Progress:   13 on 7353  Progress:   14 on 7353  Progress:   15 on 7353  Progress:   16 on 7353  Progress:   17 on 7353  Progress:   18 on 7353  Progress:   19 on 7353  Progress:   20 on 7353  Progress:   21 on 7353  Progress:   22 on 7353  Progress:   23 on 7353  Progress:   24 on 7353  Progress:   25 on 7353  Progress:   26 on 7353  Progress:   27 on 7353  Progress:   28 on 7353  Progress:   29 on 7353  Progress:   30 on 7353  Progress:   31 on 7353  Progress:   32 on 7353  Progress:   33 on 7353  Progress:   34 on 7353  Progress:   35 on 7353  Progress:   36 on 7353  Progress:   37 on 7353  Progress:   38 on 7353  Progress:   39 on 7353  Progress:   40 on 7353  Progress:   41 on 7353  Progress:   42 on 7353  Progress:   43 on 7353  Progress:   44 on 7353  Progress:   45 on 7353  Progress:   46 on 7353  Progress:   47 on 7353  Progress:   48 on 7353  Progress:   49 on 7353  Progress:   50 on 7353  Progress:   51 on 7353  Progress:   52 on 7353  Progress:   53 on 7353  Progress:   54 on 7353  Progress:   55 on 7353  Progress:   56 on 7353  Progress:   57 on 7353  Progress:   58 on 7353  Progress:   59 on 7353  Progress:   60 on 7353  Progress:   61 on 7353  Progress:   62 on 7353  Progress:   63 on 7353  Progress:   64 on 7353  Progress:   65 on 7353  Progress:   66 on 7353  Progress:   67 on 7353  Progress:   68 on 7353  Progress:   69 on 7353  Progress:   70 on 7353  Progress:   71 on 7353  Progress:   72 on 7353  Progress:   73 on 7353  Progress:   74 on 7353  Progress:   75 on 7353  Progress:   76 on 7353  Progress:   77 on 7353  Progress:   78 on 7353  Progress:   79 on 7353  Progress:   80 on 7353  Progress:   81 on 7353  Progress:   82 on 7353  Progress:   83 on 7353  Progress:   84 on 7353  Progress:   85 on 7353  Progress:   86 on 7353  Progress:   87 on 7353  Progress:   88 on 7353  Progress:   89 on 7353  Progress:   90 on 7353  Progress:   91 on 7353  Progress:   92 on 7353  Progress:   93 on 7353  Progress:   94 on 7353  Progress:   95 on 7353  Progress:   96 on 7353  Progress:   97 on 7353  Progress:   98 on 7353  Progress:   99 on 7353  Progress:  100 on 7353  Progress:  101 on 7353  Progress:  102 on 7353  Progress:  103 on 7353  Progress:  104 on 7353  Progress:  105 on 7353  Progress:  106 on 7353  Progress:  107 on 7353  Progress:  108 on 7353  Progress:  109 on 7353  Progress:  110 on 7353  Progress:  111 on 7353  Progress:  112 on 7353  Progress:  113 on 7353  Progress:  114 on 7353  Progress:  115 on 7353  Progress:  116 on 7353  Progress:  117 on 7353  Progress:  118 on 7353  Progress:  119 on 7353  Progress:  120 on 7353  Progress:  121 on 7353  Progress:  122 on 7353  Progress:  123 on 7353  Progress:  124 on 7353  Progress:  125 on 7353  Progress:  126 on 7353  Progress:  127 on 7353  Progress:  128 on 7353  Progress:  129 on 7353  Progress:  130 on 7353  Progress:  131 on 7353  Progress:  132 on 7353  Progress:  133 on 7353  Progress:  134 on 7353  Progress:  135 on 7353  Progress:  136 on 7353  Progress:  137 on 7353  Progress:  138 on 7353  Progress:  139 on 7353  Progress:  140 on 7353  Progress:  141 on 7353  Progress:  142 on 7353  Progress:  143 on 7353  Progress:  144 on 7353  Progress:  145 on 7353  Progress:  146 on 7353  Progress:  147 on 7353  Progress:  148 on 7353  Progress:  149 on 7353  Progress:  150 on 7353  Progress:  151 on 7353  Progress:  152 on 7353  Progress:  153 on 7353  Progress:  154 on 7353  Progress:  155 on 7353  Progress:  156 on 7353  Progress:  157 on 7353  Progress:  158 on 7353  Progress:  159 on 7353  Progress:  160 on 7353  Progress:  161 on 7353  Progress:  162 on 7353  Progress:  163 on 7353  Progress:  164 on 7353  Progress:  165 on 7353  Progress:  166 on 7353  Progress:  167 on 7353  Progress:  168 on 7353  Progress:  169 on 7353  Progress:  170 on 7353  Progress:  171 on 7353  Progress:  172 on 7353  Progress:  173 on 7353  Progress:  174 on 7353  Progress:  175 on 7353  Progress:  176 on 7353  Progress:  177 on 7353  Progress:  178 on 7353  Progress:  179 on 7353  Progress:  180 on 7353  Progress:  181 on 7353  Progress:  182 on 7353  Progress:  183 on 7353  Progress:  184 on 7353  Progress:  185 on 7353  Progress:  186 on 7353  Progress:  187 on 7353  Progress:  188 on 7353  Progress:  189 on 7353  Progress:  190 on 7353  Progress:  191 on 7353  Progress:  192 on 7353  Progress:  193 on 7353  Progress:  194 on 7353  Progress:  195 on 7353  Progress:  196 on 7353  Progress:  197 on 7353  Progress:  198 on 7353  Progress:  199 on 7353  Progress:  200 on 7353  Progress:  201 on 7353  Progress:  202 on 7353  Progress:  203 on 7353  Progress:  204 on 7353  Progress:  205 on 7353  Progress:  206 on 7353  Progress:  207 on 7353  Progress:  208 on 7353  Progress:  209 on 7353  Progress:  210 on 7353  Progress:  211 on 7353  Progress:  212 on 7353  Progress:  213 on 7353  Progress:  214 on 7353  Progress:  215 on 7353  Progress:  216 on 7353  Progress:  217 on 7353  Progress:  218 on 7353  Progress:  219 on 7353  Progress:  220 on 7353  Progress:  221 on 7353  Progress:  222 on 7353  Progress:  223 on 7353  Progress:  224 on 7353  Progress:  225 on 7353  Progress:  226 on 7353  Progress:  227 on 7353  Progress:  228 on 7353  Progress:  229 on 7353  Progress:  230 on 7353  Progress:  231 on 7353  Progress:  232 on 7353  Progress:  233 on 7353  Progress:  234 on 7353  Progress:  235 on 7353  Progress:  236 on 7353  Progress:  237 on 7353  Progress:  238 on 7353  Progress:  239 on 7353  Progress:  240 on 7353  Progress:  241 on 7353  Progress:  242 on 7353  Progress:  243 on 7353  Progress:  244 on 7353  Progress:  245 on 7353  Progress:  246 on 7353  Progress:  247 on 7353  Progress:  248 on 7353  Progress:  249 on 7353  Progress:  250 on 7353  Progress:  251 on 7353  Progress:  252 on 7353  Progress:  253 on 7353  Progress:  254 on 7353  Progress:  255 on 7353  Progress:  256 on 7353  Progress:  257 on 7353  Progress:  258 on 7353  Progress:  259 on 7353  Progress:  260 on 7353  Progress:  261 on 7353  Progress:  262 on 7353  Progress:  263 on 7353  Progress:  264 on 7353  Progress:  265 on 7353  Progress:  266 on 7353  Progress:  267 on 7353  Progress:  268 on 7353  Progress:  269 on 7353  Progress:  270 on 7353  Progress:  271 on 7353  Progress:  272 on 7353  Progress:  273 on 7353  Progress:  274 on 7353  Progress:  275 on 7353  Progress:  276 on 7353  Progress:  277 on 7353  Progress:  278 on 7353  Progress:  279 on 7353  Progress:  280 on 7353  Progress:  281 on 7353  Progress:  282 on 7353  Progress:  283 on 7353  Progress:  284 on 7353  Progress:  285 on 7353  Progress:  286 on 7353  Progress:  287 on 7353  Progress:  288 on 7353  Progress:  289 on 7353  Progress:  290 on 7353  Progress:  291 on 7353  Progress:  292 on 7353  Progress:  293 on 7353  Progress:  294 on 7353  Progress:  295 on 7353  Progress:  296 on 7353  Progress:  297 on 7353  Progress:  298 on 7353  Progress:  299 on 7353  Progress:  300 on 7353  Progress:  301 on 7353  Progress:  302 on 7353  Progress:  303 on 7353  Progress:  304 on 7353  Progress:  305 on 7353  Progress:  306 on 7353  Progress:  307 on 7353  Progress:  308 on 7353  Progress:  309 on 7353  Progress:  310 on 7353  Progress:  311 on 7353  Progress:  312 on 7353  Progress:  313 on 7353  Progress:  314 on 7353  Progress:  315 on 7353  Progress:  316 on 7353  Progress:  317 on 7353  Progress:  318 on 7353  Progress:  319 on 7353  Progress:  320 on 7353  Progress:  321 on 7353  Progress:  322 on 7353  Progress:  323 on 7353  Progress:  324 on 7353  Progress:  325 on 7353  Progress:  326 on 7353  Progress:  327 on 7353  Progress:  328 on 7353  Progress:  329 on 7353  Progress:  330 on 7353  Progress:  331 on 7353  Progress:  332 on 7353  Progress:  333 on 7353  Progress:  334 on 7353  Progress:  335 on 7353  Progress:  336 on 7353  Progress:  337 on 7353  Progress:  338 on 7353  Progress:  339 on 7353  Progress:  340 on 7353  Progress:  341 on 7353  Progress:  342 on 7353  Progress:  343 on 7353  Progress:  344 on 7353  Progress:  345 on 7353  Progress:  346 on 7353  Progress:  347 on 7353  Progress:  348 on 7353  Progress:  349 on 7353  Progress:  350 on 7353  Progress:  351 on 7353  Progress:  352 on 7353  Progress:  353 on 7353  Progress:  354 on 7353  Progress:  355 on 7353  Progress:  356 on 7353  Progress:  357 on 7353  Progress:  358 on 7353  Progress:  359 on 7353  Progress:  360 on 7353  Progress:  361 on 7353  Progress:  362 on 7353  Progress:  363 on 7353  Progress:  364 on 7353  Progress:  365 on 7353  Progress:  366 on 7353  Progress:  367 on 7353  Progress:  368 on 7353  Progress:  369 on 7353  Progress:  370 on 7353  Progress:  371 on 7353  Progress:  372 on 7353  Progress:  373 on 7353  Progress:  374 on 7353  Progress:  375 on 7353  Progress:  376 on 7353  Progress:  377 on 7353  Progress:  378 on 7353  Progress:  379 on 7353  Progress:  380 on 7353  Progress:  381 on 7353  Progress:  382 on 7353  Progress:  383 on 7353  Progress:  384 on 7353  Progress:  385 on 7353  Progress:  386 on 7353  Progress:  387 on 7353  Progress:  388 on 7353  Progress:  389 on 7353  Progress:  390 on 7353  Progress:  391 on 7353  Progress:  392 on 7353  Progress:  393 on 7353  Progress:  394 on 7353  Progress:  395 on 7353  Progress:  396 on 7353  Progress:  397 on 7353  Progress:  398 on 7353  Progress:  399 on 7353  Progress:  400 on 7353  Progress:  401 on 7353  Progress:  402 on 7353  Progress:  403 on 7353  Progress:  404 on 7353  Progress:  405 on 7353  Progress:  406 on 7353  Progress:  407 on 7353  Progress:  408 on 7353  Progress:  409 on 7353  Progress:  410 on 7353  Progress:  411 on 7353  Progress:  412 on 7353  Progress:  413 on 7353  Progress:  414 on 7353  Progress:  415 on 7353  Progress:  416 on 7353  Progress:  417 on 7353  Progress:  418 on 7353  Progress:  419 on 7353  Progress:  420 on 7353  Progress:  421 on 7353  Progress:  422 on 7353  Progress:  423 on 7353  Progress:  424 on 7353  Progress:  425 on 7353  Progress:  426 on 7353  Progress:  427 on 7353  Progress:  428 on 7353  Progress:  429 on 7353  Progress:  430 on 7353  Progress:  431 on 7353  Progress:  432 on 7353  Progress:  433 on 7353  Progress:  434 on 7353  Progress:  435 on 7353  Progress:  436 on 7353  Progress:  437 on 7353  Progress:  438 on 7353  Progress:  439 on 7353  Progress:  440 on 7353  Progress:  441 on 7353  Progress:  442 on 7353  Progress:  443 on 7353  Progress:  444 on 7353  Progress:  445 on 7353  Progress:  446 on 7353  Progress:  447 on 7353  Progress:  448 on 7353  Progress:  449 on 7353  Progress:  450 on 7353  Progress:  451 on 7353  Progress:  452 on 7353  Progress:  453 on 7353  Progress:  454 on 7353  Progress:  455 on 7353  Progress:  456 on 7353  Progress:  457 on 7353  Progress:  458 on 7353  Progress:  459 on 7353  Progress:  460 on 7353  Progress:  461 on 7353  Progress:  462 on 7353  Progress:  463 on 7353  Progress:  464 on 7353  Progress:  465 on 7353  Progress:  466 on 7353  Progress:  467 on 7353  Progress:  468 on 7353  Progress:  469 on 7353  Progress:  470 on 7353  Progress:  471 on 7353  Progress:  472 on 7353  Progress:  473 on 7353  Progress:  474 on 7353  Progress:  475 on 7353  Progress:  476 on 7353  Progress:  477 on 7353  Progress:  478 on 7353  Progress:  479 on 7353  Progress:  480 on 7353  Progress:  481 on 7353  Progress:  482 on 7353  Progress:  483 on 7353  Progress:  484 on 7353  Progress:  485 on 7353  Progress:  486 on 7353  Progress:  487 on 7353  Progress:  488 on 7353  Progress:  489 on 7353  Progress:  490 on 7353  Progress:  491 on 7353  Progress:  492 on 7353  Progress:  493 on 7353  Progress:  494 on 7353  Progress:  495 on 7353  Progress:  496 on 7353  Progress:  497 on 7353  Progress:  498 on 7353  Progress:  499 on 7353  Progress:  500 on 7353  Progress:  501 on 7353  Progress:  502 on 7353  Progress:  503 on 7353  Progress:  504 on 7353  Progress:  505 on 7353  Progress:  506 on 7353  Progress:  507 on 7353  Progress:  508 on 7353  Progress:  509 on 7353  Progress:  510 on 7353  Progress:  511 on 7353  Progress:  512 on 7353  Progress:  513 on 7353  Progress:  514 on 7353  Progress:  515 on 7353  Progress:  516 on 7353  Progress:  517 on 7353  Progress:  518 on 7353  Progress:  519 on 7353  Progress:  520 on 7353  Progress:  521 on 7353  Progress:  522 on 7353  Progress:  523 on 7353  Progress:  524 on 7353  Progress:  525 on 7353  Progress:  526 on 7353  Progress:  527 on 7353  Progress:  528 on 7353  Progress:  529 on 7353  Progress:  530 on 7353  Progress:  531 on 7353  Progress:  532 on 7353  Progress:  533 on 7353  Progress:  534 on 7353  Progress:  535 on 7353  Progress:  536 on 7353  Progress:  537 on 7353  Progress:  538 on 7353  Progress:  539 on 7353  Progress:  540 on 7353  Progress:  541 on 7353  Progress:  542 on 7353  Progress:  543 on 7353  Progress:  544 on 7353  Progress:  545 on 7353  Progress:  546 on 7353  Progress:  547 on 7353  Progress:  548 on 7353  Progress:  549 on 7353  Progress:  550 on 7353  Progress:  551 on 7353  Progress:  552 on 7353  Progress:  553 on 7353  Progress:  554 on 7353  Progress:  555 on 7353  Progress:  556 on 7353  Progress:  557 on 7353  Progress:  558 on 7353  Progress:  559 on 7353  Progress:  560 on 7353  Progress:  561 on 7353  Progress:  562 on 7353  Progress:  563 on 7353  Progress:  564 on 7353  Progress:  565 on 7353  Progress:  566 on 7353  Progress:  567 on 7353  Progress:  568 on 7353  Progress:  569 on 7353  Progress:  570 on 7353  Progress:  571 on 7353  Progress:  572 on 7353  Progress:  573 on 7353  Progress:  574 on 7353  Progress:  575 on 7353  Progress:  576 on 7353  Progress:  577 on 7353  Progress:  578 on 7353  Progress:  579 on 7353  Progress:  580 on 7353  Progress:  581 on 7353  Progress:  582 on 7353  Progress:  583 on 7353  Progress:  584 on 7353  Progress:  585 on 7353  Progress:  586 on 7353  Progress:  587 on 7353  Progress:  588 on 7353  Progress:  589 on 7353  Progress:  590 on 7353  Progress:  591 on 7353  Progress:  592 on 7353  Progress:  593 on 7353  Progress:  594 on 7353  Progress:  595 on 7353  Progress:  596 on 7353  Progress:  597 on 7353  Progress:  598 on 7353  Progress:  599 on 7353  Progress:  600 on 7353  Progress:  601 on 7353  Progress:  602 on 7353  Progress:  603 on 7353  Progress:  604 on 7353  Progress:  605 on 7353  Progress:  606 on 7353  Progress:  607 on 7353  Progress:  608 on 7353  Progress:  609 on 7353  Progress:  610 on 7353  Progress:  611 on 7353  Progress:  612 on 7353  Progress:  613 on 7353  Progress:  614 on 7353  Progress:  615 on 7353  Progress:  616 on 7353  Progress:  617 on 7353  Progress:  618 on 7353  Progress:  619 on 7353  Progress:  620 on 7353  Progress:  621 on 7353  Progress:  622 on 7353  Progress:  623 on 7353  Progress:  624 on 7353  Progress:  625 on 7353  Progress:  626 on 7353  Progress:  627 on 7353  Progress:  628 on 7353  Progress:  629 on 7353  Progress:  630 on 7353  Progress:  631 on 7353  Progress:  632 on 7353  Progress:  633 on 7353  Progress:  634 on 7353  Progress:  635 on 7353  Progress:  636 on 7353  Progress:  637 on 7353  Progress:  638 on 7353  Progress:  639 on 7353  Progress:  640 on 7353  Progress:  641 on 7353  Progress:  642 on 7353  Progress:  643 on 7353  Progress:  644 on 7353  Progress:  645 on 7353  Progress:  646 on 7353  Progress:  647 on 7353  Progress:  648 on 7353  Progress:  649 on 7353  Progress:  650 on 7353  Progress:  651 on 7353  Progress:  652 on 7353  Progress:  653 on 7353  Progress:  654 on 7353  Progress:  655 on 7353  Progress:  656 on 7353  Progress:  657 on 7353  Progress:  658 on 7353  Progress:  659 on 7353  Progress:  660 on 7353  Progress:  661 on 7353  Progress:  662 on 7353  Progress:  663 on 7353  Progress:  664 on 7353  Progress:  665 on 7353  Progress:  666 on 7353  Progress:  667 on 7353  Progress:  668 on 7353  Progress:  669 on 7353  Progress:  670 on 7353  Progress:  671 on 7353  Progress:  672 on 7353  Progress:  673 on 7353  Progress:  674 on 7353  Progress:  675 on 7353  Progress:  676 on 7353  Progress:  677 on 7353  Progress:  678 on 7353  Progress:  679 on 7353  Progress:  680 on 7353  Progress:  681 on 7353  Progress:  682 on 7353  Progress:  683 on 7353  Progress:  684 on 7353  Progress:  685 on 7353  Progress:  686 on 7353  Progress:  687 on 7353  Progress:  688 on 7353  Progress:  689 on 7353  Progress:  690 on 7353  Progress:  691 on 7353  Progress:  692 on 7353  Progress:  693 on 7353  Progress:  694 on 7353  Progress:  695 on 7353  Progress:  696 on 7353  Progress:  697 on 7353  Progress:  698 on 7353  Progress:  699 on 7353  Progress:  700 on 7353  Progress:  701 on 7353  Progress:  702 on 7353  Progress:  703 on 7353  Progress:  704 on 7353  Progress:  705 on 7353  Progress:  706 on 7353  Progress:  707 on 7353  Progress:  708 on 7353  Progress:  709 on 7353  Progress:  710 on 7353  Progress:  711 on 7353  Progress:  712 on 7353  Progress:  713 on 7353  Progress:  714 on 7353  Progress:  715 on 7353  Progress:  716 on 7353  Progress:  717 on 7353  Progress:  718 on 7353  Progress:  719 on 7353  Progress:  720 on 7353  Progress:  721 on 7353  Progress:  722 on 7353  Progress:  723 on 7353  Progress:  724 on 7353  Progress:  725 on 7353  Progress:  726 on 7353  Progress:  727 on 7353  Progress:  728 on 7353  Progress:  729 on 7353  Progress:  730 on 7353  Progress:  731 on 7353  Progress:  732 on 7353  Progress:  733 on 7353  Progress:  734 on 7353  Progress:  735 on 7353  Progress:  736 on 7353  Progress:  737 on 7353  Progress:  738 on 7353  Progress:  739 on 7353  Progress:  740 on 7353  Progress:  741 on 7353  Progress:  742 on 7353  Progress:  743 on 7353  Progress:  744 on 7353  Progress:  745 on 7353  Progress:  746 on 7353  Progress:  747 on 7353  Progress:  748 on 7353  Progress:  749 on 7353  Progress:  750 on 7353  Progress:  751 on 7353  Progress:  752 on 7353  Progress:  753 on 7353  Progress:  754 on 7353  Progress:  755 on 7353  Progress:  756 on 7353  Progress:  757 on 7353  Progress:  758 on 7353  Progress:  759 on 7353  Progress:  760 on 7353  Progress:  761 on 7353  Progress:  762 on 7353  Progress:  763 on 7353  Progress:  764 on 7353  Progress:  765 on 7353  Progress:  766 on 7353  Progress:  767 on 7353  Progress:  768 on 7353  Progress:  769 on 7353  Progress:  770 on 7353  Progress:  771 on 7353  Progress:  772 on 7353  Progress:  773 on 7353  Progress:  774 on 7353  Progress:  775 on 7353  Progress:  776 on 7353  Progress:  777 on 7353  Progress:  778 on 7353  Progress:  779 on 7353  Progress:  780 on 7353  Progress:  781 on 7353  Progress:  782 on 7353  Progress:  783 on 7353  Progress:  784 on 7353  Progress:  785 on 7353  Progress:  786 on 7353  Progress:  787 on 7353  Progress:  788 on 7353  Progress:  789 on 7353  Progress:  790 on 7353  Progress:  791 on 7353  Progress:  792 on 7353  Progress:  793 on 7353  Progress:  794 on 7353  Progress:  795 on 7353  Progress:  796 on 7353  Progress:  797 on 7353  Progress:  798 on 7353  Progress:  799 on 7353  Progress:  800 on 7353  Progress:  801 on 7353  Progress:  802 on 7353  Progress:  803 on 7353  Progress:  804 on 7353  Progress:  805 on 7353  Progress:  806 on 7353  Progress:  807 on 7353  Progress:  808 on 7353  Progress:  809 on 7353  Progress:  810 on 7353  Progress:  811 on 7353  Progress:  812 on 7353  Progress:  813 on 7353  Progress:  814 on 7353  Progress:  815 on 7353  Progress:  816 on 7353  Progress:  817 on 7353  Progress:  818 on 7353  Progress:  819 on 7353  Progress:  820 on 7353  Progress:  821 on 7353  Progress:  822 on 7353  Progress:  823 on 7353  Progress:  824 on 7353  Progress:  825 on 7353  Progress:  826 on 7353  Progress:  827 on 7353  Progress:  828 on 7353  Progress:  829 on 7353  Progress:  830 on 7353  Progress:  831 on 7353  Progress:  832 on 7353  Progress:  833 on 7353  Progress:  834 on 7353  Progress:  835 on 7353  Progress:  836 on 7353  Progress:  837 on 7353  Progress:  838 on 7353  Progress:  839 on 7353  Progress:  840 on 7353  Progress:  841 on 7353  Progress:  842 on 7353  Progress:  843 on 7353  Progress:  844 on 7353  Progress:  845 on 7353  Progress:  846 on 7353  Progress:  847 on 7353  Progress:  848 on 7353  Progress:  849 on 7353  Progress:  850 on 7353  Progress:  851 on 7353  Progress:  852 on 7353  Progress:  853 on 7353  Progress:  854 on 7353  Progress:  855 on 7353  Progress:  856 on 7353  Progress:  857 on 7353  Progress:  858 on 7353  Progress:  859 on 7353  Progress:  860 on 7353  Progress:  861 on 7353  Progress:  862 on 7353  Progress:  863 on 7353  Progress:  864 on 7353  Progress:  865 on 7353  Progress:  866 on 7353  Progress:  867 on 7353  Progress:  868 on 7353  Progress:  869 on 7353  Progress:  870 on 7353  Progress:  871 on 7353  Progress:  872 on 7353  Progress:  873 on 7353  Progress:  874 on 7353  Progress:  875 on 7353  Progress:  876 on 7353  Progress:  877 on 7353  Progress:  878 on 7353  Progress:  879 on 7353  Progress:  880 on 7353  Progress:  881 on 7353  Progress:  882 on 7353  Progress:  883 on 7353  Progress:  884 on 7353  Progress:  885 on 7353  Progress:  886 on 7353  Progress:  887 on 7353  Progress:  888 on 7353  Progress:  889 on 7353  Progress:  890 on 7353  Progress:  891 on 7353  Progress:  892 on 7353  Progress:  893 on 7353  Progress:  894 on 7353  Progress:  895 on 7353  Progress:  896 on 7353  Progress:  897 on 7353  Progress:  898 on 7353  Progress:  899 on 7353  Progress:  900 on 7353  Progress:  901 on 7353  Progress:  902 on 7353  Progress:  903 on 7353  Progress:  904 on 7353  Progress:  905 on 7353  Progress:  906 on 7353  Progress:  907 on 7353  Progress:  908 on 7353  Progress:  909 on 7353  Progress:  910 on 7353  Progress:  911 on 7353  Progress:  912 on 7353  Progress:  913 on 7353  Progress:  914 on 7353  Progress:  915 on 7353  Progress:  916 on 7353  Progress:  917 on 7353  Progress:  918 on 7353  Progress:  919 on 7353  Progress:  920 on 7353  Progress:  921 on 7353  Progress:  922 on 7353  Progress:  923 on 7353  Progress:  924 on 7353  Progress:  925 on 7353  Progress:  926 on 7353  Progress:  927 on 7353  Progress:  928 on 7353  Progress:  929 on 7353  Progress:  930 on 7353  Progress:  931 on 7353  Progress:  932 on 7353  Progress:  933 on 7353  Progress:  934 on 7353  Progress:  935 on 7353  Progress:  936 on 7353  Progress:  937 on 7353  Progress:  938 on 7353  Progress:  939 on 7353  Progress:  940 on 7353  Progress:  941 on 7353  Progress:  942 on 7353  Progress:  943 on 7353  Progress:  944 on 7353  Progress:  945 on 7353  Progress:  946 on 7353  Progress:  947 on 7353  Progress:  948 on 7353  Progress:  949 on 7353  Progress:  950 on 7353  Progress:  951 on 7353  Progress:  952 on 7353  Progress:  953 on 7353  Progress:  954 on 7353  Progress:  955 on 7353  Progress:  956 on 7353  Progress:  957 on 7353  Progress:  958 on 7353  Progress:  959 on 7353  Progress:  960 on 7353  Progress:  961 on 7353  Progress:  962 on 7353  Progress:  963 on 7353  Progress:  964 on 7353  Progress:  965 on 7353  Progress:  966 on 7353  Progress:  967 on 7353  Progress:  968 on 7353  Progress:  969 on 7353  Progress:  970 on 7353  Progress:  971 on 7353  Progress:  972 on 7353  Progress:  973 on 7353  Progress:  974 on 7353  Progress:  975 on 7353  Progress:  976 on 7353  Progress:  977 on 7353  Progress:  978 on 7353  Progress:  979 on 7353  Progress:  980 on 7353  Progress:  981 on 7353  Progress:  982 on 7353  Progress:  983 on 7353  Progress:  984 on 7353  Progress:  985 on 7353  Progress:  986 on 7353  Progress:  987 on 7353  Progress:  988 on 7353  Progress:  989 on 7353  Progress:  990 on 7353  Progress:  991 on 7353  Progress:  992 on 7353  Progress:  993 on 7353  Progress:  994 on 7353  Progress:  995 on 7353  Progress:  996 on 7353  Progress:  997 on 7353  Progress:  998 on 7353  Progress:  999 on 7353  Progress: 1000 on 7353  Progress: 1001 on 7353  Progress: 1002 on 7353  Progress: 1003 on 7353  Progress: 1004 on 7353  Progress: 1005 on 7353  Progress: 1006 on 7353  Progress: 1007 on 7353  Progress: 1008 on 7353  Progress: 1009 on 7353  Progress: 1010 on 7353  Progress: 1011 on 7353  Progress: 1012 on 7353  Progress: 1013 on 7353  Progress: 1014 on 7353  Progress: 1015 on 7353  Progress: 1016 on 7353  Progress: 1017 on 7353  Progress: 1018 on 7353  Progress: 1019 on 7353  Progress: 1020 on 7353  Progress: 1021 on 7353  Progress: 1022 on 7353  Progress: 1023 on 7353  Progress: 1024 on 7353  Progress: 1025 on 7353  Progress: 1026 on 7353  Progress: 1027 on 7353  Progress: 1028 on 7353  Progress: 1029 on 7353  Progress: 1030 on 7353  Progress: 1031 on 7353  Progress: 1032 on 7353  Progress: 1033 on 7353  Progress: 1034 on 7353  Progress: 1035 on 7353  Progress: 1036 on 7353  Progress: 1037 on 7353  Progress: 1038 on 7353  Progress: 1039 on 7353  Progress: 1040 on 7353  Progress: 1041 on 7353  Progress: 1042 on 7353  Progress: 1043 on 7353  Progress: 1044 on 7353  Progress: 1045 on 7353  Progress: 1046 on 7353  Progress: 1047 on 7353  Progress: 1048 on 7353  Progress: 1049 on 7353  Progress: 1050 on 7353  Progress: 1051 on 7353  Progress: 1052 on 7353  Progress: 1053 on 7353  Progress: 1054 on 7353  Progress: 1055 on 7353  Progress: 1056 on 7353  Progress: 1057 on 7353  Progress: 1058 on 7353  Progress: 1059 on 7353  Progress: 1060 on 7353  Progress: 1061 on 7353  Progress: 1062 on 7353  Progress: 1063 on 7353  Progress: 1064 on 7353  Progress: 1065 on 7353  Progress: 1066 on 7353  Progress: 1067 on 7353  Progress: 1068 on 7353  Progress: 1069 on 7353  Progress: 1070 on 7353  Progress: 1071 on 7353  Progress: 1072 on 7353  Progress: 1073 on 7353  Progress: 1074 on 7353  Progress: 1075 on 7353  Progress: 1076 on 7353  Progress: 1077 on 7353  Progress: 1078 on 7353  Progress: 1079 on 7353  Progress: 1080 on 7353  Progress: 1081 on 7353  Progress: 1082 on 7353  Progress: 1083 on 7353  Progress: 1084 on 7353  Progress: 1085 on 7353  Progress: 1086 on 7353  Progress: 1087 on 7353  Progress: 1088 on 7353  Progress: 1089 on 7353  Progress: 1090 on 7353  Progress: 1091 on 7353  Progress: 1092 on 7353  Progress: 1093 on 7353  Progress: 1094 on 7353  Progress: 1095 on 7353  Progress: 1096 on 7353  Progress: 1097 on 7353  Progress: 1098 on 7353  Progress: 1099 on 7353  Progress: 1100 on 7353  Progress: 1101 on 7353  Progress: 1102 on 7353  Progress: 1103 on 7353  Progress: 1104 on 7353  Progress: 1105 on 7353  Progress: 1106 on 7353  Progress: 1107 on 7353  Progress: 1108 on 7353  Progress: 1109 on 7353  Progress: 1110 on 7353  Progress: 1111 on 7353  Progress: 1112 on 7353  Progress: 1113 on 7353  Progress: 1114 on 7353  Progress: 1115 on 7353  Progress: 1116 on 7353  Progress: 1117 on 7353  Progress: 1118 on 7353  Progress: 1119 on 7353  Progress: 1120 on 7353  Progress: 1121 on 7353  Progress: 1122 on 7353  Progress: 1123 on 7353  Progress: 1124 on 7353  Progress: 1125 on 7353  Progress: 1126 on 7353  Progress: 1127 on 7353  Progress: 1128 on 7353  Progress: 1129 on 7353  Progress: 1130 on 7353  Progress: 1131 on 7353  Progress: 1132 on 7353  Progress: 1133 on 7353  Progress: 1134 on 7353  Progress: 1135 on 7353  Progress: 1136 on 7353  Progress: 1137 on 7353  Progress: 1138 on 7353  Progress: 1139 on 7353  Progress: 1140 on 7353  Progress: 1141 on 7353  Progress: 1142 on 7353  Progress: 1143 on 7353  Progress: 1144 on 7353  Progress: 1145 on 7353  Progress: 1146 on 7353  Progress: 1147 on 7353  Progress: 1148 on 7353  Progress: 1149 on 7353  Progress: 1150 on 7353  Progress: 1151 on 7353  Progress: 1152 on 7353  Progress: 1153 on 7353  Progress: 1154 on 7353  Progress: 1155 on 7353  Progress: 1156 on 7353  Progress: 1157 on 7353  Progress: 1158 on 7353  Progress: 1159 on 7353  Progress: 1160 on 7353  Progress: 1161 on 7353  Progress: 1162 on 7353  Progress: 1163 on 7353  Progress: 1164 on 7353  Progress: 1165 on 7353  Progress: 1166 on 7353  Progress: 1167 on 7353  Progress: 1168 on 7353  Progress: 1169 on 7353  Progress: 1170 on 7353  Progress: 1171 on 7353  Progress: 1172 on 7353  Progress: 1173 on 7353  Progress: 1174 on 7353  Progress: 1175 on 7353  Progress: 1176 on 7353  Progress: 1177 on 7353  Progress: 1178 on 7353  Progress: 1179 on 7353  Progress: 1180 on 7353  Progress: 1181 on 7353  Progress: 1182 on 7353  Progress: 1183 on 7353  Progress: 1184 on 7353  Progress: 1185 on 7353  Progress: 1186 on 7353  Progress: 1187 on 7353  Progress: 1188 on 7353  Progress: 1189 on 7353  Progress: 1190 on 7353  Progress: 1191 on 7353  Progress: 1192 on 7353  Progress: 1193 on 7353  Progress: 1194 on 7353  Progress: 1195 on 7353  Progress: 1196 on 7353  Progress: 1197 on 7353  Progress: 1198 on 7353  Progress: 1199 on 7353  Progress: 1200 on 7353  Progress: 1201 on 7353  Progress: 1202 on 7353  Progress: 1203 on 7353  Progress: 1204 on 7353  Progress: 1205 on 7353  Progress: 1206 on 7353  Progress: 1207 on 7353  Progress: 1208 on 7353  Progress: 1209 on 7353  Progress: 1210 on 7353  Progress: 1211 on 7353  Progress: 1212 on 7353  Progress: 1213 on 7353  Progress: 1214 on 7353  Progress: 1215 on 7353  Progress: 1216 on 7353  Progress: 1217 on 7353  Progress: 1218 on 7353  Progress: 1219 on 7353  Progress: 1220 on 7353  Progress: 1221 on 7353  Progress: 1222 on 7353  Progress: 1223 on 7353  Progress: 1224 on 7353  Progress: 1225 on 7353  Progress: 1226 on 7353  Progress: 1227 on 7353  Progress: 1228 on 7353  Progress: 1229 on 7353  Progress: 1230 on 7353  Progress: 1231 on 7353  Progress: 1232 on 7353  Progress: 1233 on 7353  Progress: 1234 on 7353  Progress: 1235 on 7353  Progress: 1236 on 7353  Progress: 1237 on 7353  Progress: 1238 on 7353  Progress: 1239 on 7353  Progress: 1240 on 7353  Progress: 1241 on 7353  Progress: 1242 on 7353  Progress: 1243 on 7353  Progress: 1244 on 7353  Progress: 1245 on 7353  Progress: 1246 on 7353  Progress: 1247 on 7353  Progress: 1248 on 7353  Progress: 1249 on 7353  Progress: 1250 on 7353  Progress: 1251 on 7353  Progress: 1252 on 7353  Progress: 1253 on 7353  Progress: 1254 on 7353  Progress: 1255 on 7353  Progress: 1256 on 7353  Progress: 1257 on 7353  Progress: 1258 on 7353  Progress: 1259 on 7353  Progress: 1260 on 7353  Progress: 1261 on 7353  Progress: 1262 on 7353  Progress: 1263 on 7353  Progress: 1264 on 7353  Progress: 1265 on 7353  Progress: 1266 on 7353  Progress: 1267 on 7353  Progress: 1268 on 7353  Progress: 1269 on 7353  Progress: 1270 on 7353  Progress: 1271 on 7353  Progress: 1272 on 7353  Progress: 1273 on 7353  Progress: 1274 on 7353  Progress: 1275 on 7353  Progress: 1276 on 7353  Progress: 1277 on 7353  Progress: 1278 on 7353  Progress: 1279 on 7353  Progress: 1280 on 7353  Progress: 1281 on 7353  Progress: 1282 on 7353  Progress: 1283 on 7353  Progress: 1284 on 7353  Progress: 1285 on 7353  Progress: 1286 on 7353  Progress: 1287 on 7353  Progress: 1288 on 7353  Progress: 1289 on 7353  Progress: 1290 on 7353  Progress: 1291 on 7353  Progress: 1292 on 7353  Progress: 1293 on 7353  Progress: 1294 on 7353  Progress: 1295 on 7353  Progress: 1296 on 7353  Progress: 1297 on 7353  Progress: 1298 on 7353  Progress: 1299 on 7353  Progress: 1300 on 7353  Progress: 1301 on 7353  Progress: 1302 on 7353  Progress: 1303 on 7353  Progress: 1304 on 7353  Progress: 1305 on 7353  Progress: 1306 on 7353  Progress: 1307 on 7353  Progress: 1308 on 7353  Progress: 1309 on 7353  Progress: 1310 on 7353  Progress: 1311 on 7353  Progress: 1312 on 7353  Progress: 1313 on 7353  Progress: 1314 on 7353  Progress: 1315 on 7353  Progress: 1316 on 7353  Progress: 1317 on 7353  Progress: 1318 on 7353  Progress: 1319 on 7353  Progress: 1320 on 7353  Progress: 1321 on 7353  Progress: 1322 on 7353  Progress: 1323 on 7353  Progress: 1324 on 7353  Progress: 1325 on 7353  Progress: 1326 on 7353  Progress: 1327 on 7353  Progress: 1328 on 7353  Progress: 1329 on 7353  Progress: 1330 on 7353  Progress: 1331 on 7353  Progress: 1332 on 7353  Progress: 1333 on 7353  Progress: 1334 on 7353  Progress: 1335 on 7353  Progress: 1336 on 7353  Progress: 1337 on 7353  Progress: 1338 on 7353  Progress: 1339 on 7353  Progress: 1340 on 7353  Progress: 1341 on 7353  Progress: 1342 on 7353  Progress: 1343 on 7353  Progress: 1344 on 7353  Progress: 1345 on 7353  Progress: 1346 on 7353  Progress: 1347 on 7353  Progress: 1348 on 7353  Progress: 1349 on 7353  Progress: 1350 on 7353  Progress: 1351 on 7353  Progress: 1352 on 7353  Progress: 1353 on 7353  Progress: 1354 on 7353  Progress: 1355 on 7353  Progress: 1356 on 7353  Progress: 1357 on 7353  Progress: 1358 on 7353  Progress: 1359 on 7353  Progress: 1360 on 7353  Progress: 1361 on 7353  Progress: 1362 on 7353  Progress: 1363 on 7353  Progress: 1364 on 7353  Progress: 1365 on 7353  Progress: 1366 on 7353  Progress: 1367 on 7353  Progress: 1368 on 7353  Progress: 1369 on 7353  Progress: 1370 on 7353  Progress: 1371 on 7353  Progress: 1372 on 7353  Progress: 1373 on 7353  Progress: 1374 on 7353  Progress: 1375 on 7353  Progress: 1376 on 7353  Progress: 1377 on 7353  Progress: 1378 on 7353  Progress: 1379 on 7353  Progress: 1380 on 7353  Progress: 1381 on 7353  Progress: 1382 on 7353  Progress: 1383 on 7353  Progress: 1384 on 7353  Progress: 1385 on 7353  Progress: 1386 on 7353  Progress: 1387 on 7353  Progress: 1388 on 7353  Progress: 1389 on 7353  Progress: 1390 on 7353  Progress: 1391 on 7353  Progress: 1392 on 7353  Progress: 1393 on 7353  Progress: 1394 on 7353  Progress: 1395 on 7353  Progress: 1396 on 7353  Progress: 1397 on 7353  Progress: 1398 on 7353  Progress: 1399 on 7353  Progress: 1400 on 7353  Progress: 1401 on 7353  Progress: 1402 on 7353  Progress: 1403 on 7353  Progress: 1404 on 7353  Progress: 1405 on 7353  Progress: 1406 on 7353  Progress: 1407 on 7353  Progress: 1408 on 7353  Progress: 1409 on 7353  Progress: 1410 on 7353  Progress: 1411 on 7353  Progress: 1412 on 7353  Progress: 1413 on 7353  Progress: 1414 on 7353  Progress: 1415 on 7353  Progress: 1416 on 7353  Progress: 1417 on 7353  Progress: 1418 on 7353  Progress: 1419 on 7353  Progress: 1420 on 7353  Progress: 1421 on 7353  Progress: 1422 on 7353  Progress: 1423 on 7353  Progress: 1424 on 7353  Progress: 1425 on 7353  Progress: 1426 on 7353  Progress: 1427 on 7353  Progress: 1428 on 7353  Progress: 1429 on 7353  Progress: 1430 on 7353  Progress: 1431 on 7353  Progress: 1432 on 7353  Progress: 1433 on 7353  Progress: 1434 on 7353  Progress: 1435 on 7353  Progress: 1436 on 7353  Progress: 1437 on 7353  Progress: 1438 on 7353  Progress: 1439 on 7353  Progress: 1440 on 7353  Progress: 1441 on 7353  Progress: 1442 on 7353  Progress: 1443 on 7353  Progress: 1444 on 7353  Progress: 1445 on 7353  Progress: 1446 on 7353  Progress: 1447 on 7353  Progress: 1448 on 7353  Progress: 1449 on 7353  Progress: 1450 on 7353  Progress: 1451 on 7353  Progress: 1452 on 7353  Progress: 1453 on 7353  Progress: 1454 on 7353  Progress: 1455 on 7353  Progress: 1456 on 7353  Progress: 1457 on 7353  Progress: 1458 on 7353  Progress: 1459 on 7353  Progress: 1460 on 7353  Progress: 1461 on 7353  Progress: 1462 on 7353  Progress: 1463 on 7353  Progress: 1464 on 7353  Progress: 1465 on 7353  Progress: 1466 on 7353  Progress: 1467 on 7353  Progress: 1468 on 7353  Progress: 1469 on 7353  Progress: 1470 on 7353  Progress: 1471 on 7353  Progress: 1472 on 7353  Progress: 1473 on 7353  Progress: 1474 on 7353  Progress: 1475 on 7353  Progress: 1476 on 7353  Progress: 1477 on 7353  Progress: 1478 on 7353  Progress: 1479 on 7353  Progress: 1480 on 7353  Progress: 1481 on 7353  Progress: 1482 on 7353  Progress: 1483 on 7353  Progress: 1484 on 7353  Progress: 1485 on 7353  Progress: 1486 on 7353  Progress: 1487 on 7353  Progress: 1488 on 7353  Progress: 1489 on 7353  Progress: 1490 on 7353  Progress: 1491 on 7353  Progress: 1492 on 7353  Progress: 1493 on 7353  Progress: 1494 on 7353  Progress: 1495 on 7353  Progress: 1496 on 7353  Progress: 1497 on 7353  Progress: 1498 on 7353  Progress: 1499 on 7353  Progress: 1500 on 7353  Progress: 1501 on 7353  Progress: 1502 on 7353  Progress: 1503 on 7353  Progress: 1504 on 7353  Progress: 1505 on 7353  Progress: 1506 on 7353  Progress: 1507 on 7353  Progress: 1508 on 7353  Progress: 1509 on 7353  Progress: 1510 on 7353  Progress: 1511 on 7353  Progress: 1512 on 7353  Progress: 1513 on 7353  Progress: 1514 on 7353  Progress: 1515 on 7353  Progress: 1516 on 7353  Progress: 1517 on 7353  Progress: 1518 on 7353  Progress: 1519 on 7353  Progress: 1520 on 7353  Progress: 1521 on 7353  Progress: 1522 on 7353  Progress: 1523 on 7353  Progress: 1524 on 7353  Progress: 1525 on 7353  Progress: 1526 on 7353  Progress: 1527 on 7353  Progress: 1528 on 7353  Progress: 1529 on 7353  Progress: 1530 on 7353  Progress: 1531 on 7353  Progress: 1532 on 7353  Progress: 1533 on 7353  Progress: 1534 on 7353  Progress: 1535 on 7353  Progress: 1536 on 7353  Progress: 1537 on 7353  Progress: 1538 on 7353  Progress: 1539 on 7353  Progress: 1540 on 7353  Progress: 1541 on 7353  Progress: 1542 on 7353  Progress: 1543 on 7353  Progress: 1544 on 7353  Progress: 1545 on 7353  Progress: 1546 on 7353  Progress: 1547 on 7353  Progress: 1548 on 7353  Progress: 1549 on 7353  Progress: 1550 on 7353  Progress: 1551 on 7353  Progress: 1552 on 7353  Progress: 1553 on 7353  Progress: 1554 on 7353  Progress: 1555 on 7353  Progress: 1556 on 7353  Progress: 1557 on 7353  Progress: 1558 on 7353  Progress: 1559 on 7353  Progress: 1560 on 7353  Progress: 1561 on 7353  Progress: 1562 on 7353  Progress: 1563 on 7353  Progress: 1564 on 7353  Progress: 1565 on 7353  Progress: 1566 on 7353  Progress: 1567 on 7353  Progress: 1568 on 7353  Progress: 1569 on 7353  Progress: 1570 on 7353  Progress: 1571 on 7353  Progress: 1572 on 7353  Progress: 1573 on 7353  Progress: 1574 on 7353  Progress: 1575 on 7353  Progress: 1576 on 7353  Progress: 1577 on 7353  Progress: 1578 on 7353  Progress: 1579 on 7353  Progress: 1580 on 7353  Progress: 1581 on 7353  Progress: 1582 on 7353  Progress: 1583 on 7353  Progress: 1584 on 7353  Progress: 1585 on 7353  Progress: 1586 on 7353  Progress: 1587 on 7353  Progress: 1588 on 7353  Progress: 1589 on 7353  Progress: 1590 on 7353  Progress: 1591 on 7353  Progress: 1592 on 7353  Progress: 1593 on 7353  Progress: 1594 on 7353  Progress: 1595 on 7353  Progress: 1596 on 7353  Progress: 1597 on 7353  Progress: 1598 on 7353  Progress: 1599 on 7353  Progress: 1600 on 7353  Progress: 1601 on 7353  Progress: 1602 on 7353  Progress: 1603 on 7353  Progress: 1604 on 7353  Progress: 1605 on 7353  Progress: 1606 on 7353  Progress: 1607 on 7353  Progress: 1608 on 7353  Progress: 1609 on 7353  Progress: 1610 on 7353  Progress: 1611 on 7353  Progress: 1612 on 7353  Progress: 1613 on 7353  Progress: 1614 on 7353  Progress: 1615 on 7353  Progress: 1616 on 7353  Progress: 1617 on 7353  Progress: 1618 on 7353  Progress: 1619 on 7353  Progress: 1620 on 7353  Progress: 1621 on 7353  Progress: 1622 on 7353  Progress: 1623 on 7353  Progress: 1624 on 7353  Progress: 1625 on 7353  Progress: 1626 on 7353  Progress: 1627 on 7353  Progress: 1628 on 7353  Progress: 1629 on 7353  Progress: 1630 on 7353  Progress: 1631 on 7353  Progress: 1632 on 7353  Progress: 1633 on 7353  Progress: 1634 on 7353  Progress: 1635 on 7353  Progress: 1636 on 7353  Progress: 1637 on 7353  Progress: 1638 on 7353  Progress: 1639 on 7353  Progress: 1640 on 7353  Progress: 1641 on 7353  Progress: 1642 on 7353  Progress: 1643 on 7353  Progress: 1644 on 7353  Progress: 1645 on 7353  Progress: 1646 on 7353  Progress: 1647 on 7353  Progress: 1648 on 7353  Progress: 1649 on 7353  Progress: 1650 on 7353  Progress: 1651 on 7353  Progress: 1652 on 7353  Progress: 1653 on 7353  Progress: 1654 on 7353  Progress: 1655 on 7353  Progress: 1656 on 7353  Progress: 1657 on 7353  Progress: 1658 on 7353  Progress: 1659 on 7353  Progress: 1660 on 7353  Progress: 1661 on 7353  Progress: 1662 on 7353  Progress: 1663 on 7353  Progress: 1664 on 7353  Progress: 1665 on 7353  Progress: 1666 on 7353  Progress: 1667 on 7353  Progress: 1668 on 7353  Progress: 1669 on 7353  Progress: 1670 on 7353  Progress: 1671 on 7353  Progress: 1672 on 7353  Progress: 1673 on 7353  Progress: 1674 on 7353  Progress: 1675 on 7353  Progress: 1676 on 7353  Progress: 1677 on 7353  Progress: 1678 on 7353  Progress: 1679 on 7353  Progress: 1680 on 7353  Progress: 1681 on 7353  Progress: 1682 on 7353  Progress: 1683 on 7353  Progress: 1684 on 7353  Progress: 1685 on 7353  Progress: 1686 on 7353  Progress: 1687 on 7353  Progress: 1688 on 7353  Progress: 1689 on 7353  Progress: 1690 on 7353  Progress: 1691 on 7353  Progress: 1692 on 7353  Progress: 1693 on 7353  Progress: 1694 on 7353  Progress: 1695 on 7353  Progress: 1696 on 7353  Progress: 1697 on 7353  Progress: 1698 on 7353  Progress: 1699 on 7353  Progress: 1700 on 7353  Progress: 1701 on 7353  Progress: 1702 on 7353  Progress: 1703 on 7353  Progress: 1704 on 7353  Progress: 1705 on 7353  Progress: 1706 on 7353  Progress: 1707 on 7353  Progress: 1708 on 7353  Progress: 1709 on 7353  Progress: 1710 on 7353  Progress: 1711 on 7353  Progress: 1712 on 7353  Progress: 1713 on 7353  Progress: 1714 on 7353  Progress: 1715 on 7353  Progress: 1716 on 7353  Progress: 1717 on 7353  Progress: 1718 on 7353  Progress: 1719 on 7353  Progress: 1720 on 7353  Progress: 1721 on 7353  Progress: 1722 on 7353  Progress: 1723 on 7353  Progress: 1724 on 7353  Progress: 1725 on 7353  Progress: 1726 on 7353  Progress: 1727 on 7353  Progress: 1728 on 7353  Progress: 1729 on 7353  Progress: 1730 on 7353  Progress: 1731 on 7353  Progress: 1732 on 7353  Progress: 1733 on 7353  Progress: 1734 on 7353  Progress: 1735 on 7353  Progress: 1736 on 7353  Progress: 1737 on 7353  Progress: 1738 on 7353  Progress: 1739 on 7353  Progress: 1740 on 7353  Progress: 1741 on 7353  Progress: 1742 on 7353  Progress: 1743 on 7353  Progress: 1744 on 7353  Progress: 1745 on 7353  Progress: 1746 on 7353  Progress: 1747 on 7353  Progress: 1748 on 7353  Progress: 1749 on 7353  Progress: 1750 on 7353  Progress: 1751 on 7353  Progress: 1752 on 7353  Progress: 1753 on 7353  Progress: 1754 on 7353  Progress: 1755 on 7353  Progress: 1756 on 7353  Progress: 1757 on 7353  Progress: 1758 on 7353  Progress: 1759 on 7353  Progress: 1760 on 7353  Progress: 1761 on 7353  Progress: 1762 on 7353  Progress: 1763 on 7353  Progress: 1764 on 7353  Progress: 1765 on 7353  Progress: 1766 on 7353  Progress: 1767 on 7353  Progress: 1768 on 7353  Progress: 1769 on 7353  Progress: 1770 on 7353  Progress: 1771 on 7353  Progress: 1772 on 7353  Progress: 1773 on 7353  Progress: 1774 on 7353  Progress: 1775 on 7353  Progress: 1776 on 7353  Progress: 1777 on 7353  Progress: 1778 on 7353  Progress: 1779 on 7353  Progress: 1780 on 7353  Progress: 1781 on 7353  Progress: 1782 on 7353  Progress: 1783 on 7353  Progress: 1784 on 7353  Progress: 1785 on 7353  Progress: 1786 on 7353  Progress: 1787 on 7353  Progress: 1788 on 7353  Progress: 1789 on 7353  Progress: 1790 on 7353  Progress: 1791 on 7353  Progress: 1792 on 7353  Progress: 1793 on 7353  Progress: 1794 on 7353  Progress: 1795 on 7353  Progress: 1796 on 7353  Progress: 1797 on 7353  Progress: 1798 on 7353  Progress: 1799 on 7353  Progress: 1800 on 7353  Progress: 1801 on 7353  Progress: 1802 on 7353  Progress: 1803 on 7353  Progress: 1804 on 7353  Progress: 1805 on 7353  Progress: 1806 on 7353  Progress: 1807 on 7353  Progress: 1808 on 7353  Progress: 1809 on 7353  Progress: 1810 on 7353  Progress: 1811 on 7353  Progress: 1812 on 7353  Progress: 1813 on 7353  Progress: 1814 on 7353  Progress: 1815 on 7353  Progress: 1816 on 7353  Progress: 1817 on 7353  Progress: 1818 on 7353  Progress: 1819 on 7353  Progress: 1820 on 7353  Progress: 1821 on 7353  Progress: 1822 on 7353  Progress: 1823 on 7353  Progress: 1824 on 7353  Progress: 1825 on 7353  Progress: 1826 on 7353  Progress: 1827 on 7353  Progress: 1828 on 7353  Progress: 1829 on 7353  Progress: 1830 on 7353  Progress: 1831 on 7353  Progress: 1832 on 7353  Progress: 1833 on 7353  Progress: 1834 on 7353  Progress: 1835 on 7353  Progress: 1836 on 7353  Progress: 1837 on 7353  Progress: 1838 on 7353  Progress: 1839 on 7353  Progress: 1840 on 7353  Progress: 1841 on 7353  Progress: 1842 on 7353  Progress: 1843 on 7353  Progress: 1844 on 7353  Progress: 1845 on 7353  Progress: 1846 on 7353  Progress: 1847 on 7353  Progress: 1848 on 7353  Progress: 1849 on 7353  Progress: 1850 on 7353  Progress: 1851 on 7353  Progress: 1852 on 7353  Progress: 1853 on 7353  Progress: 1854 on 7353  Progress: 1855 on 7353  Progress: 1856 on 7353  Progress: 1857 on 7353  Progress: 1858 on 7353  Progress: 1859 on 7353  Progress: 1860 on 7353  Progress: 1861 on 7353  Progress: 1862 on 7353  Progress: 1863 on 7353  Progress: 1864 on 7353  Progress: 1865 on 7353  Progress: 1866 on 7353  Progress: 1867 on 7353  Progress: 1868 on 7353  Progress: 1869 on 7353  Progress: 1870 on 7353  Progress: 1871 on 7353  Progress: 1872 on 7353  Progress: 1873 on 7353  Progress: 1874 on 7353  Progress: 1875 on 7353  Progress: 1876 on 7353  Progress: 1877 on 7353  Progress: 1878 on 7353  Progress: 1879 on 7353  Progress: 1880 on 7353  Progress: 1881 on 7353  Progress: 1882 on 7353  Progress: 1883 on 7353  Progress: 1884 on 7353  Progress: 1885 on 7353  Progress: 1886 on 7353  Progress: 1887 on 7353  Progress: 1888 on 7353  Progress: 1889 on 7353  Progress: 1890 on 7353  Progress: 1891 on 7353  Progress: 1892 on 7353  Progress: 1893 on 7353  Progress: 1894 on 7353  Progress: 1895 on 7353  Progress: 1896 on 7353  Progress: 1897 on 7353  Progress: 1898 on 7353  Progress: 1899 on 7353  Progress: 1900 on 7353  Progress: 1901 on 7353  Progress: 1902 on 7353  Progress: 1903 on 7353  Progress: 1904 on 7353  Progress: 1905 on 7353  Progress: 1906 on 7353  Progress: 1907 on 7353  Progress: 1908 on 7353  Progress: 1909 on 7353  Progress: 1910 on 7353  Progress: 1911 on 7353  Progress: 1912 on 7353  Progress: 1913 on 7353  Progress: 1914 on 7353  Progress: 1915 on 7353  Progress: 1916 on 7353  Progress: 1917 on 7353  Progress: 1918 on 7353  Progress: 1919 on 7353  Progress: 1920 on 7353  Progress: 1921 on 7353  Progress: 1922 on 7353  Progress: 1923 on 7353  Progress: 1924 on 7353  Progress: 1925 on 7353  Progress: 1926 on 7353  Progress: 1927 on 7353  Progress: 1928 on 7353  Progress: 1929 on 7353  Progress: 1930 on 7353  Progress: 1931 on 7353  Progress: 1932 on 7353  Progress: 1933 on 7353  Progress: 1934 on 7353  Progress: 1935 on 7353  Progress: 1936 on 7353  Progress: 1937 on 7353  Progress: 1938 on 7353  Progress: 1939 on 7353  Progress: 1940 on 7353  Progress: 1941 on 7353  Progress: 1942 on 7353  Progress: 1943 on 7353  Progress: 1944 on 7353  Progress: 1945 on 7353  Progress: 1946 on 7353  Progress: 1947 on 7353  Progress: 1948 on 7353  Progress: 1949 on 7353  Progress: 1950 on 7353  Progress: 1951 on 7353  Progress: 1952 on 7353  Progress: 1953 on 7353  Progress: 1954 on 7353  Progress: 1955 on 7353  Progress: 1956 on 7353  Progress: 1957 on 7353  Progress: 1958 on 7353  Progress: 1959 on 7353  Progress: 1960 on 7353  Progress: 1961 on 7353  Progress: 1962 on 7353  Progress: 1963 on 7353  Progress: 1964 on 7353  Progress: 1965 on 7353  Progress: 1966 on 7353  Progress: 1967 on 7353  Progress: 1968 on 7353  Progress: 1969 on 7353  Progress: 1970 on 7353  Progress: 1971 on 7353  Progress: 1972 on 7353  Progress: 1973 on 7353  Progress: 1974 on 7353  Progress: 1975 on 7353  Progress: 1976 on 7353  Progress: 1977 on 7353  Progress: 1978 on 7353  Progress: 1979 on 7353  Progress: 1980 on 7353  Progress: 1981 on 7353  Progress: 1982 on 7353  Progress: 1983 on 7353  Progress: 1984 on 7353  Progress: 1985 on 7353  Progress: 1986 on 7353  Progress: 1987 on 7353  Progress: 1988 on 7353  Progress: 1989 on 7353  Progress: 1990 on 7353  Progress: 1991 on 7353  Progress: 1992 on 7353  Progress: 1993 on 7353  Progress: 1994 on 7353  Progress: 1995 on 7353  Progress: 1996 on 7353  Progress: 1997 on 7353  Progress: 1998 on 7353  Progress: 1999 on 7353  Progress: 2000 on 7353  Progress: 2001 on 7353  Progress: 2002 on 7353  Progress: 2003 on 7353  Progress: 2004 on 7353  Progress: 2005 on 7353  Progress: 2006 on 7353  Progress: 2007 on 7353  Progress: 2008 on 7353  Progress: 2009 on 7353  Progress: 2010 on 7353  Progress: 2011 on 7353  Progress: 2012 on 7353  Progress: 2013 on 7353  Progress: 2014 on 7353  Progress: 2015 on 7353  Progress: 2016 on 7353  Progress: 2017 on 7353  Progress: 2018 on 7353  Progress: 2019 on 7353  Progress: 2020 on 7353  Progress: 2021 on 7353  Progress: 2022 on 7353  Progress: 2023 on 7353  Progress: 2024 on 7353  Progress: 2025 on 7353  Progress: 2026 on 7353  Progress: 2027 on 7353  Progress: 2028 on 7353  Progress: 2029 on 7353  Progress: 2030 on 7353  Progress: 2031 on 7353  Progress: 2032 on 7353  Progress: 2033 on 7353  Progress: 2034 on 7353  Progress: 2035 on 7353  Progress: 2036 on 7353  Progress: 2037 on 7353  Progress: 2038 on 7353  Progress: 2039 on 7353  Progress: 2040 on 7353  Progress: 2041 on 7353  Progress: 2042 on 7353  Progress: 2043 on 7353  Progress: 2044 on 7353  Progress: 2045 on 7353  Progress: 2046 on 7353  Progress: 2047 on 7353  Progress: 2048 on 7353  Progress: 2049 on 7353  Progress: 2050 on 7353  Progress: 2051 on 7353  Progress: 2052 on 7353  Progress: 2053 on 7353  Progress: 2054 on 7353  Progress: 2055 on 7353  Progress: 2056 on 7353  Progress: 2057 on 7353  Progress: 2058 on 7353  Progress: 2059 on 7353  Progress: 2060 on 7353  Progress: 2061 on 7353  Progress: 2062 on 7353  Progress: 2063 on 7353  Progress: 2064 on 7353  Progress: 2065 on 7353  Progress: 2066 on 7353  Progress: 2067 on 7353  Progress: 2068 on 7353  Progress: 2069 on 7353  Progress: 2070 on 7353  Progress: 2071 on 7353  Progress: 2072 on 7353  Progress: 2073 on 7353  Progress: 2074 on 7353  Progress: 2075 on 7353  Progress: 2076 on 7353  Progress: 2077 on 7353  Progress: 2078 on 7353  Progress: 2079 on 7353  Progress: 2080 on 7353  Progress: 2081 on 7353  Progress: 2082 on 7353  Progress: 2083 on 7353  Progress: 2084 on 7353  Progress: 2085 on 7353  Progress: 2086 on 7353  Progress: 2087 on 7353  Progress: 2088 on 7353  Progress: 2089 on 7353  Progress: 2090 on 7353  Progress: 2091 on 7353  Progress: 2092 on 7353  Progress: 2093 on 7353  Progress: 2094 on 7353  Progress: 2095 on 7353  Progress: 2096 on 7353  Progress: 2097 on 7353  Progress: 2098 on 7353  Progress: 2099 on 7353  Progress: 2100 on 7353  Progress: 2101 on 7353  Progress: 2102 on 7353  Progress: 2103 on 7353  Progress: 2104 on 7353  Progress: 2105 on 7353  Progress: 2106 on 7353  Progress: 2107 on 7353  Progress: 2108 on 7353  Progress: 2109 on 7353  Progress: 2110 on 7353  Progress: 2111 on 7353  Progress: 2112 on 7353  Progress: 2113 on 7353  Progress: 2114 on 7353  Progress: 2115 on 7353  Progress: 2116 on 7353  Progress: 2117 on 7353  Progress: 2118 on 7353  Progress: 2119 on 7353  Progress: 2120 on 7353  Progress: 2121 on 7353  Progress: 2122 on 7353  Progress: 2123 on 7353  Progress: 2124 on 7353  Progress: 2125 on 7353  Progress: 2126 on 7353  Progress: 2127 on 7353  Progress: 2128 on 7353  Progress: 2129 on 7353  Progress: 2130 on 7353  Progress: 2131 on 7353  Progress: 2132 on 7353  Progress: 2133 on 7353  Progress: 2134 on 7353  Progress: 2135 on 7353  Progress: 2136 on 7353  Progress: 2137 on 7353  Progress: 2138 on 7353  Progress: 2139 on 7353  Progress: 2140 on 7353  Progress: 2141 on 7353  Progress: 2142 on 7353  Progress: 2143 on 7353  Progress: 2144 on 7353  Progress: 2145 on 7353  Progress: 2146 on 7353  Progress: 2147 on 7353  Progress: 2148 on 7353  Progress: 2149 on 7353  Progress: 2150 on 7353  Progress: 2151 on 7353  Progress: 2152 on 7353  Progress: 2153 on 7353  Progress: 2154 on 7353  Progress: 2155 on 7353  Progress: 2156 on 7353  Progress: 2157 on 7353  Progress: 2158 on 7353  Progress: 2159 on 7353  Progress: 2160 on 7353  Progress: 2161 on 7353  Progress: 2162 on 7353  Progress: 2163 on 7353  Progress: 2164 on 7353  Progress: 2165 on 7353  Progress: 2166 on 7353  Progress: 2167 on 7353  Progress: 2168 on 7353  Progress: 2169 on 7353  Progress: 2170 on 7353  Progress: 2171 on 7353  Progress: 2172 on 7353  Progress: 2173 on 7353  Progress: 2174 on 7353  Progress: 2175 on 7353  Progress: 2176 on 7353  Progress: 2177 on 7353  Progress: 2178 on 7353  Progress: 2179 on 7353  Progress: 2180 on 7353  Progress: 2181 on 7353  Progress: 2182 on 7353  Progress: 2183 on 7353  Progress: 2184 on 7353  Progress: 2185 on 7353  Progress: 2186 on 7353  Progress: 2187 on 7353  Progress: 2188 on 7353  Progress: 2189 on 7353  Progress: 2190 on 7353  Progress: 2191 on 7353  Progress: 2192 on 7353  Progress: 2193 on 7353  Progress: 2194 on 7353  Progress: 2195 on 7353  Progress: 2196 on 7353  Progress: 2197 on 7353  Progress: 2198 on 7353  Progress: 2199 on 7353  Progress: 2200 on 7353  Progress: 2201 on 7353  Progress: 2202 on 7353  Progress: 2203 on 7353  Progress: 2204 on 7353  Progress: 2205 on 7353  Progress: 2206 on 7353  Progress: 2207 on 7353  Progress: 2208 on 7353  Progress: 2209 on 7353  Progress: 2210 on 7353  Progress: 2211 on 7353  Progress: 2212 on 7353  Progress: 2213 on 7353  Progress: 2214 on 7353  Progress: 2215 on 7353  Progress: 2216 on 7353  Progress: 2217 on 7353  Progress: 2218 on 7353  Progress: 2219 on 7353  Progress: 2220 on 7353  Progress: 2221 on 7353  Progress: 2222 on 7353  Progress: 2223 on 7353  Progress: 2224 on 7353  Progress: 2225 on 7353  Progress: 2226 on 7353  Progress: 2227 on 7353  Progress: 2228 on 7353  Progress: 2229 on 7353  Progress: 2230 on 7353  Progress: 2231 on 7353  Progress: 2232 on 7353  Progress: 2233 on 7353  Progress: 2234 on 7353  Progress: 2235 on 7353  Progress: 2236 on 7353  Progress: 2237 on 7353  Progress: 2238 on 7353  Progress: 2239 on 7353  Progress: 2240 on 7353  Progress: 2241 on 7353  Progress: 2242 on 7353  Progress: 2243 on 7353  Progress: 2244 on 7353  Progress: 2245 on 7353  Progress: 2246 on 7353  Progress: 2247 on 7353  Progress: 2248 on 7353  Progress: 2249 on 7353  Progress: 2250 on 7353  Progress: 2251 on 7353  Progress: 2252 on 7353  Progress: 2253 on 7353  Progress: 2254 on 7353  Progress: 2255 on 7353  Progress: 2256 on 7353  Progress: 2257 on 7353  Progress: 2258 on 7353  Progress: 2259 on 7353  Progress: 2260 on 7353  Progress: 2261 on 7353  Progress: 2262 on 7353  Progress: 2263 on 7353  Progress: 2264 on 7353  Progress: 2265 on 7353  Progress: 2266 on 7353  Progress: 2267 on 7353  Progress: 2268 on 7353  Progress: 2269 on 7353  Progress: 2270 on 7353  Progress: 2271 on 7353  Progress: 2272 on 7353  Progress: 2273 on 7353  Progress: 2274 on 7353  Progress: 2275 on 7353  Progress: 2276 on 7353  Progress: 2277 on 7353  Progress: 2278 on 7353  Progress: 2279 on 7353  Progress: 2280 on 7353  Progress: 2281 on 7353  Progress: 2282 on 7353  Progress: 2283 on 7353  Progress: 2284 on 7353  Progress: 2285 on 7353  Progress: 2286 on 7353  Progress: 2287 on 7353  Progress: 2288 on 7353  Progress: 2289 on 7353  Progress: 2290 on 7353  Progress: 2291 on 7353  Progress: 2292 on 7353  Progress: 2293 on 7353  Progress: 2294 on 7353  Progress: 2295 on 7353  Progress: 2296 on 7353  Progress: 2297 on 7353  Progress: 2298 on 7353  Progress: 2299 on 7353  Progress: 2300 on 7353  Progress: 2301 on 7353  Progress: 2302 on 7353  Progress: 2303 on 7353  Progress: 2304 on 7353  Progress: 2305 on 7353  Progress: 2306 on 7353  Progress: 2307 on 7353  Progress: 2308 on 7353  Progress: 2309 on 7353  Progress: 2310 on 7353  Progress: 2311 on 7353  Progress: 2312 on 7353  Progress: 2313 on 7353  Progress: 2314 on 7353  Progress: 2315 on 7353  Progress: 2316 on 7353  Progress: 2317 on 7353  Progress: 2318 on 7353  Progress: 2319 on 7353  Progress: 2320 on 7353  Progress: 2321 on 7353  Progress: 2322 on 7353  Progress: 2323 on 7353  Progress: 2324 on 7353  Progress: 2325 on 7353  Progress: 2326 on 7353  Progress: 2327 on 7353  Progress: 2328 on 7353  Progress: 2329 on 7353  Progress: 2330 on 7353  Progress: 2331 on 7353  Progress: 2332 on 7353  Progress: 2333 on 7353  Progress: 2334 on 7353  Progress: 2335 on 7353  Progress: 2336 on 7353  Progress: 2337 on 7353  Progress: 2338 on 7353  Progress: 2339 on 7353  Progress: 2340 on 7353  Progress: 2341 on 7353  Progress: 2342 on 7353  Progress: 2343 on 7353  Progress: 2344 on 7353  Progress: 2345 on 7353  Progress: 2346 on 7353  Progress: 2347 on 7353  Progress: 2348 on 7353  Progress: 2349 on 7353  Progress: 2350 on 7353  Progress: 2351 on 7353  Progress: 2352 on 7353  Progress: 2353 on 7353  Progress: 2354 on 7353  Progress: 2355 on 7353  Progress: 2356 on 7353  Progress: 2357 on 7353  Progress: 2358 on 7353  Progress: 2359 on 7353  Progress: 2360 on 7353  Progress: 2361 on 7353  Progress: 2362 on 7353  Progress: 2363 on 7353  Progress: 2364 on 7353  Progress: 2365 on 7353  Progress: 2366 on 7353  Progress: 2367 on 7353  Progress: 2368 on 7353  Progress: 2369 on 7353  Progress: 2370 on 7353  Progress: 2371 on 7353  Progress: 2372 on 7353  Progress: 2373 on 7353  Progress: 2374 on 7353  Progress: 2375 on 7353  Progress: 2376 on 7353  Progress: 2377 on 7353  Progress: 2378 on 7353  Progress: 2379 on 7353  Progress: 2380 on 7353  Progress: 2381 on 7353  Progress: 2382 on 7353  Progress: 2383 on 7353  Progress: 2384 on 7353  Progress: 2385 on 7353  Progress: 2386 on 7353  Progress: 2387 on 7353  Progress: 2388 on 7353  Progress: 2389 on 7353  Progress: 2390 on 7353  Progress: 2391 on 7353  Progress: 2392 on 7353  Progress: 2393 on 7353  Progress: 2394 on 7353  Progress: 2395 on 7353  Progress: 2396 on 7353  Progress: 2397 on 7353  Progress: 2398 on 7353  Progress: 2399 on 7353  Progress: 2400 on 7353  Progress: 2401 on 7353  Progress: 2402 on 7353  Progress: 2403 on 7353  Progress: 2404 on 7353  Progress: 2405 on 7353  Progress: 2406 on 7353  Progress: 2407 on 7353  Progress: 2408 on 7353  Progress: 2409 on 7353  Progress: 2410 on 7353  Progress: 2411 on 7353  Progress: 2412 on 7353  Progress: 2413 on 7353  Progress: 2414 on 7353  Progress: 2415 on 7353  Progress: 2416 on 7353  Progress: 2417 on 7353  Progress: 2418 on 7353  Progress: 2419 on 7353  Progress: 2420 on 7353  Progress: 2421 on 7353  Progress: 2422 on 7353  Progress: 2423 on 7353  Progress: 2424 on 7353  Progress: 2425 on 7353  Progress: 2426 on 7353  Progress: 2427 on 7353  Progress: 2428 on 7353  Progress: 2429 on 7353  Progress: 2430 on 7353  Progress: 2431 on 7353  Progress: 2432 on 7353  Progress: 2433 on 7353  Progress: 2434 on 7353  Progress: 2435 on 7353  Progress: 2436 on 7353  Progress: 2437 on 7353  Progress: 2438 on 7353  Progress: 2439 on 7353  Progress: 2440 on 7353  Progress: 2441 on 7353  Progress: 2442 on 7353  Progress: 2443 on 7353  Progress: 2444 on 7353  Progress: 2445 on 7353  Progress: 2446 on 7353  Progress: 2447 on 7353  Progress: 2448 on 7353  Progress: 2449 on 7353  Progress: 2450 on 7353  Progress: 2451 on 7353  Progress: 2452 on 7353  Progress: 2453 on 7353  Progress: 2454 on 7353  Progress: 2455 on 7353  Progress: 2456 on 7353  Progress: 2457 on 7353  Progress: 2458 on 7353  Progress: 2459 on 7353  Progress: 2460 on 7353  Progress: 2461 on 7353  Progress: 2462 on 7353  Progress: 2463 on 7353  Progress: 2464 on 7353  Progress: 2465 on 7353  Progress: 2466 on 7353  Progress: 2467 on 7353  Progress: 2468 on 7353  Progress: 2469 on 7353  Progress: 2470 on 7353  Progress: 2471 on 7353  Progress: 2472 on 7353  Progress: 2473 on 7353  Progress: 2474 on 7353  Progress: 2475 on 7353  Progress: 2476 on 7353  Progress: 2477 on 7353  Progress: 2478 on 7353  Progress: 2479 on 7353  Progress: 2480 on 7353  Progress: 2481 on 7353  Progress: 2482 on 7353  Progress: 2483 on 7353  Progress: 2484 on 7353  Progress: 2485 on 7353  Progress: 2486 on 7353  Progress: 2487 on 7353  Progress: 2488 on 7353  Progress: 2489 on 7353  Progress: 2490 on 7353  Progress: 2491 on 7353  Progress: 2492 on 7353  Progress: 2493 on 7353  Progress: 2494 on 7353  Progress: 2495 on 7353  Progress: 2496 on 7353  Progress: 2497 on 7353  Progress: 2498 on 7353  Progress: 2499 on 7353  Progress: 2500 on 7353  Progress: 2501 on 7353  Progress: 2502 on 7353  Progress: 2503 on 7353  Progress: 2504 on 7353  Progress: 2505 on 7353  Progress: 2506 on 7353  Progress: 2507 on 7353  Progress: 2508 on 7353  Progress: 2509 on 7353  Progress: 2510 on 7353  Progress: 2511 on 7353  Progress: 2512 on 7353  Progress: 2513 on 7353  Progress: 2514 on 7353  Progress: 2515 on 7353  Progress: 2516 on 7353  Progress: 2517 on 7353  Progress: 2518 on 7353  Progress: 2519 on 7353  Progress: 2520 on 7353  Progress: 2521 on 7353  Progress: 2522 on 7353  Progress: 2523 on 7353  Progress: 2524 on 7353  Progress: 2525 on 7353  Progress: 2526 on 7353  Progress: 2527 on 7353  Progress: 2528 on 7353  Progress: 2529 on 7353  Progress: 2530 on 7353  Progress: 2531 on 7353  Progress: 2532 on 7353  Progress: 2533 on 7353  Progress: 2534 on 7353  Progress: 2535 on 7353  Progress: 2536 on 7353  Progress: 2537 on 7353  Progress: 2538 on 7353  Progress: 2539 on 7353  Progress: 2540 on 7353  Progress: 2541 on 7353  Progress: 2542 on 7353  Progress: 2543 on 7353  Progress: 2544 on 7353  Progress: 2545 on 7353  Progress: 2546 on 7353  Progress: 2547 on 7353  Progress: 2548 on 7353  Progress: 2549 on 7353  Progress: 2550 on 7353  Progress: 2551 on 7353  Progress: 2552 on 7353  Progress: 2553 on 7353  Progress: 2554 on 7353  Progress: 2555 on 7353  Progress: 2556 on 7353  Progress: 2557 on 7353  Progress: 2558 on 7353  Progress: 2559 on 7353  Progress: 2560 on 7353  Progress: 2561 on 7353  Progress: 2562 on 7353  Progress: 2563 on 7353  Progress: 2564 on 7353  Progress: 2565 on 7353  Progress: 2566 on 7353  Progress: 2567 on 7353  Progress: 2568 on 7353  Progress: 2569 on 7353  Progress: 2570 on 7353  Progress: 2571 on 7353  Progress: 2572 on 7353  Progress: 2573 on 7353  Progress: 2574 on 7353  Progress: 2575 on 7353  Progress: 2576 on 7353  Progress: 2577 on 7353  Progress: 2578 on 7353  Progress: 2579 on 7353  Progress: 2580 on 7353  Progress: 2581 on 7353  Progress: 2582 on 7353  Progress: 2583 on 7353  Progress: 2584 on 7353  Progress: 2585 on 7353  Progress: 2586 on 7353  Progress: 2587 on 7353  Progress: 2588 on 7353  Progress: 2589 on 7353  Progress: 2590 on 7353  Progress: 2591 on 7353  Progress: 2592 on 7353  Progress: 2593 on 7353  Progress: 2594 on 7353  Progress: 2595 on 7353  Progress: 2596 on 7353  Progress: 2597 on 7353  Progress: 2598 on 7353  Progress: 2599 on 7353  Progress: 2600 on 7353  Progress: 2601 on 7353  Progress: 2602 on 7353  Progress: 2603 on 7353  Progress: 2604 on 7353  Progress: 2605 on 7353  Progress: 2606 on 7353  Progress: 2607 on 7353  Progress: 2608 on 7353  Progress: 2609 on 7353  Progress: 2610 on 7353  Progress: 2611 on 7353  Progress: 2612 on 7353  Progress: 2613 on 7353  Progress: 2614 on 7353  Progress: 2615 on 7353  Progress: 2616 on 7353  Progress: 2617 on 7353  Progress: 2618 on 7353  Progress: 2619 on 7353  Progress: 2620 on 7353  Progress: 2621 on 7353  Progress: 2622 on 7353  Progress: 2623 on 7353  Progress: 2624 on 7353  Progress: 2625 on 7353  Progress: 2626 on 7353  Progress: 2627 on 7353  Progress: 2628 on 7353  Progress: 2629 on 7353  Progress: 2630 on 7353  Progress: 2631 on 7353  Progress: 2632 on 7353  Progress: 2633 on 7353  Progress: 2634 on 7353  Progress: 2635 on 7353  Progress: 2636 on 7353  Progress: 2637 on 7353  Progress: 2638 on 7353  Progress: 2639 on 7353  Progress: 2640 on 7353  Progress: 2641 on 7353  Progress: 2642 on 7353  Progress: 2643 on 7353  Progress: 2644 on 7353  Progress: 2645 on 7353  Progress: 2646 on 7353  Progress: 2647 on 7353  Progress: 2648 on 7353  Progress: 2649 on 7353  Progress: 2650 on 7353  Progress: 2651 on 7353  Progress: 2652 on 7353  Progress: 2653 on 7353  Progress: 2654 on 7353  Progress: 2655 on 7353  Progress: 2656 on 7353  Progress: 2657 on 7353  Progress: 2658 on 7353  Progress: 2659 on 7353  Progress: 2660 on 7353  Progress: 2661 on 7353  Progress: 2662 on 7353  Progress: 2663 on 7353  Progress: 2664 on 7353  Progress: 2665 on 7353  Progress: 2666 on 7353  Progress: 2667 on 7353  Progress: 2668 on 7353  Progress: 2669 on 7353  Progress: 2670 on 7353  Progress: 2671 on 7353  Progress: 2672 on 7353  Progress: 2673 on 7353  Progress: 2674 on 7353  Progress: 2675 on 7353  Progress: 2676 on 7353  Progress: 2677 on 7353  Progress: 2678 on 7353  Progress: 2679 on 7353  Progress: 2680 on 7353  Progress: 2681 on 7353  Progress: 2682 on 7353  Progress: 2683 on 7353  Progress: 2684 on 7353  Progress: 2685 on 7353  Progress: 2686 on 7353  Progress: 2687 on 7353  Progress: 2688 on 7353  Progress: 2689 on 7353  Progress: 2690 on 7353  Progress: 2691 on 7353  Progress: 2692 on 7353  Progress: 2693 on 7353  Progress: 2694 on 7353  Progress: 2695 on 7353  Progress: 2696 on 7353  Progress: 2697 on 7353  Progress: 2698 on 7353  Progress: 2699 on 7353  Progress: 2700 on 7353  Progress: 2701 on 7353  Progress: 2702 on 7353  Progress: 2703 on 7353  Progress: 2704 on 7353  Progress: 2705 on 7353  Progress: 2706 on 7353  Progress: 2707 on 7353  Progress: 2708 on 7353  Progress: 2709 on 7353  Progress: 2710 on 7353  Progress: 2711 on 7353  Progress: 2712 on 7353  Progress: 2713 on 7353  Progress: 2714 on 7353  Progress: 2715 on 7353  Progress: 2716 on 7353  Progress: 2717 on 7353  Progress: 2718 on 7353  Progress: 2719 on 7353  Progress: 2720 on 7353  Progress: 2721 on 7353  Progress: 2722 on 7353  Progress: 2723 on 7353  Progress: 2724 on 7353  Progress: 2725 on 7353  Progress: 2726 on 7353  Progress: 2727 on 7353  Progress: 2728 on 7353  Progress: 2729 on 7353  Progress: 2730 on 7353  Progress: 2731 on 7353  Progress: 2732 on 7353  Progress: 2733 on 7353  Progress: 2734 on 7353  Progress: 2735 on 7353  Progress: 2736 on 7353  Progress: 2737 on 7353  Progress: 2738 on 7353  Progress: 2739 on 7353  Progress: 2740 on 7353  Progress: 2741 on 7353  Progress: 2742 on 7353  Progress: 2743 on 7353  Progress: 2744 on 7353  Progress: 2745 on 7353  Progress: 2746 on 7353  Progress: 2747 on 7353  Progress: 2748 on 7353  Progress: 2749 on 7353  Progress: 2750 on 7353  Progress: 2751 on 7353  Progress: 2752 on 7353  Progress: 2753 on 7353  Progress: 2754 on 7353  Progress: 2755 on 7353  Progress: 2756 on 7353  Progress: 2757 on 7353  Progress: 2758 on 7353  Progress: 2759 on 7353  Progress: 2760 on 7353  Progress: 2761 on 7353  Progress: 2762 on 7353  Progress: 2763 on 7353  Progress: 2764 on 7353  Progress: 2765 on 7353  Progress: 2766 on 7353  Progress: 2767 on 7353  Progress: 2768 on 7353  Progress: 2769 on 7353  Progress: 2770 on 7353  Progress: 2771 on 7353  Progress: 2772 on 7353  Progress: 2773 on 7353  Progress: 2774 on 7353  Progress: 2775 on 7353  Progress: 2776 on 7353  Progress: 2777 on 7353  Progress: 2778 on 7353  Progress: 2779 on 7353  Progress: 2780 on 7353  Progress: 2781 on 7353  Progress: 2782 on 7353  Progress: 2783 on 7353  Progress: 2784 on 7353  Progress: 2785 on 7353  Progress: 2786 on 7353  Progress: 2787 on 7353  Progress: 2788 on 7353  Progress: 2789 on 7353  Progress: 2790 on 7353  Progress: 2791 on 7353  Progress: 2792 on 7353  Progress: 2793 on 7353  Progress: 2794 on 7353  Progress: 2795 on 7353  Progress: 2796 on 7353  Progress: 2797 on 7353  Progress: 2798 on 7353  Progress: 2799 on 7353  Progress: 2800 on 7353  Progress: 2801 on 7353  Progress: 2802 on 7353  Progress: 2803 on 7353  Progress: 2804 on 7353  Progress: 2805 on 7353  Progress: 2806 on 7353  Progress: 2807 on 7353  Progress: 2808 on 7353  Progress: 2809 on 7353  Progress: 2810 on 7353  Progress: 2811 on 7353  Progress: 2812 on 7353  Progress: 2813 on 7353  Progress: 2814 on 7353  Progress: 2815 on 7353  Progress: 2816 on 7353  Progress: 2817 on 7353  Progress: 2818 on 7353  Progress: 2819 on 7353  Progress: 2820 on 7353  Progress: 2821 on 7353  Progress: 2822 on 7353  Progress: 2823 on 7353  Progress: 2824 on 7353  Progress: 2825 on 7353  Progress: 2826 on 7353  Progress: 2827 on 7353  Progress: 2828 on 7353  Progress: 2829 on 7353  Progress: 2830 on 7353  Progress: 2831 on 7353  Progress: 2832 on 7353  Progress: 2833 on 7353  Progress: 2834 on 7353  Progress: 2835 on 7353  Progress: 2836 on 7353  Progress: 2837 on 7353  Progress: 2838 on 7353  Progress: 2839 on 7353  Progress: 2840 on 7353  Progress: 2841 on 7353  Progress: 2842 on 7353  Progress: 2843 on 7353  Progress: 2844 on 7353  Progress: 2845 on 7353  Progress: 2846 on 7353  Progress: 2847 on 7353  Progress: 2848 on 7353  Progress: 2849 on 7353  Progress: 2850 on 7353  Progress: 2851 on 7353  Progress: 2852 on 7353  Progress: 2853 on 7353  Progress: 2854 on 7353  Progress: 2855 on 7353  Progress: 2856 on 7353  Progress: 2857 on 7353  Progress: 2858 on 7353  Progress: 2859 on 7353  Progress: 2860 on 7353  Progress: 2861 on 7353  Progress: 2862 on 7353  Progress: 2863 on 7353  Progress: 2864 on 7353  Progress: 2865 on 7353  Progress: 2866 on 7353  Progress: 2867 on 7353  Progress: 2868 on 7353  Progress: 2869 on 7353  Progress: 2870 on 7353  Progress: 2871 on 7353  Progress: 2872 on 7353  Progress: 2873 on 7353  Progress: 2874 on 7353  Progress: 2875 on 7353  Progress: 2876 on 7353  Progress: 2877 on 7353  Progress: 2878 on 7353  Progress: 2879 on 7353  Progress: 2880 on 7353  Progress: 2881 on 7353  Progress: 2882 on 7353  Progress: 2883 on 7353  Progress: 2884 on 7353  Progress: 2885 on 7353  Progress: 2886 on 7353  Progress: 2887 on 7353  Progress: 2888 on 7353  Progress: 2889 on 7353  Progress: 2890 on 7353  Progress: 2891 on 7353  Progress: 2892 on 7353  Progress: 2893 on 7353  Progress: 2894 on 7353  Progress: 2895 on 7353  Progress: 2896 on 7353  Progress: 2897 on 7353  Progress: 2898 on 7353  Progress: 2899 on 7353  Progress: 2900 on 7353  Progress: 2901 on 7353  Progress: 2902 on 7353  Progress: 2903 on 7353  Progress: 2904 on 7353  Progress: 2905 on 7353  Progress: 2906 on 7353  Progress: 2907 on 7353  Progress: 2908 on 7353  Progress: 2909 on 7353  Progress: 2910 on 7353  Progress: 2911 on 7353  Progress: 2912 on 7353  Progress: 2913 on 7353  Progress: 2914 on 7353  Progress: 2915 on 7353  Progress: 2916 on 7353  Progress: 2917 on 7353  Progress: 2918 on 7353  Progress: 2919 on 7353  Progress: 2920 on 7353  Progress: 2921 on 7353  Progress: 2922 on 7353  Progress: 2923 on 7353  Progress: 2924 on 7353  Progress: 2925 on 7353  Progress: 2926 on 7353  Progress: 2927 on 7353  Progress: 2928 on 7353  Progress: 2929 on 7353  Progress: 2930 on 7353  Progress: 2931 on 7353  Progress: 2932 on 7353  Progress: 2933 on 7353  Progress: 2934 on 7353  Progress: 2935 on 7353  Progress: 2936 on 7353  Progress: 2937 on 7353  Progress: 2938 on 7353  Progress: 2939 on 7353  Progress: 2940 on 7353  Progress: 2941 on 7353  Progress: 2942 on 7353  Progress: 2943 on 7353  Progress: 2944 on 7353  Progress: 2945 on 7353  Progress: 2946 on 7353  Progress: 2947 on 7353  Progress: 2948 on 7353  Progress: 2949 on 7353  Progress: 2950 on 7353  Progress: 2951 on 7353  Progress: 2952 on 7353  Progress: 2953 on 7353  Progress: 2954 on 7353  Progress: 2955 on 7353  Progress: 2956 on 7353  Progress: 2957 on 7353  Progress: 2958 on 7353  Progress: 2959 on 7353  Progress: 2960 on 7353  Progress: 2961 on 7353  Progress: 2962 on 7353  Progress: 2963 on 7353  Progress: 2964 on 7353  Progress: 2965 on 7353  Progress: 2966 on 7353  Progress: 2967 on 7353  Progress: 2968 on 7353  Progress: 2969 on 7353  Progress: 2970 on 7353  Progress: 2971 on 7353  Progress: 2972 on 7353  Progress: 2973 on 7353  Progress: 2974 on 7353  Progress: 2975 on 7353  Progress: 2976 on 7353  Progress: 2977 on 7353  Progress: 2978 on 7353  Progress: 2979 on 7353  Progress: 2980 on 7353  Progress: 2981 on 7353  Progress: 2982 on 7353  Progress: 2983 on 7353  Progress: 2984 on 7353  Progress: 2985 on 7353  Progress: 2986 on 7353  Progress: 2987 on 7353  Progress: 2988 on 7353  Progress: 2989 on 7353  Progress: 2990 on 7353  Progress: 2991 on 7353  Progress: 2992 on 7353  Progress: 2993 on 7353  Progress: 2994 on 7353  Progress: 2995 on 7353  Progress: 2996 on 7353  Progress: 2997 on 7353  Progress: 2998 on 7353  Progress: 2999 on 7353  Progress: 3000 on 7353  Progress: 3001 on 7353  Progress: 3002 on 7353  Progress: 3003 on 7353  Progress: 3004 on 7353  Progress: 3005 on 7353  Progress: 3006 on 7353  Progress: 3007 on 7353  Progress: 3008 on 7353  Progress: 3009 on 7353  Progress: 3010 on 7353  Progress: 3011 on 7353  Progress: 3012 on 7353  Progress: 3013 on 7353  Progress: 3014 on 7353  Progress: 3015 on 7353  Progress: 3016 on 7353  Progress: 3017 on 7353  Progress: 3018 on 7353  Progress: 3019 on 7353  Progress: 3020 on 7353  Progress: 3021 on 7353  Progress: 3022 on 7353  Progress: 3023 on 7353  Progress: 3024 on 7353  Progress: 3025 on 7353  Progress: 3026 on 7353  Progress: 3027 on 7353  Progress: 3028 on 7353  Progress: 3029 on 7353  Progress: 3030 on 7353  Progress: 3031 on 7353  Progress: 3032 on 7353  Progress: 3033 on 7353  Progress: 3034 on 7353  Progress: 3035 on 7353  Progress: 3036 on 7353  Progress: 3037 on 7353  Progress: 3038 on 7353  Progress: 3039 on 7353  Progress: 3040 on 7353  Progress: 3041 on 7353  Progress: 3042 on 7353  Progress: 3043 on 7353  Progress: 3044 on 7353  Progress: 3045 on 7353  Progress: 3046 on 7353  Progress: 3047 on 7353  Progress: 3048 on 7353  Progress: 3049 on 7353  Progress: 3050 on 7353  Progress: 3051 on 7353  Progress: 3052 on 7353  Progress: 3053 on 7353  Progress: 3054 on 7353  Progress: 3055 on 7353  Progress: 3056 on 7353  Progress: 3057 on 7353  Progress: 3058 on 7353  Progress: 3059 on 7353  Progress: 3060 on 7353  Progress: 3061 on 7353  Progress: 3062 on 7353  Progress: 3063 on 7353  Progress: 3064 on 7353  Progress: 3065 on 7353  Progress: 3066 on 7353  Progress: 3067 on 7353  Progress: 3068 on 7353  Progress: 3069 on 7353  Progress: 3070 on 7353  Progress: 3071 on 7353  Progress: 3072 on 7353  Progress: 3073 on 7353  Progress: 3074 on 7353  Progress: 3075 on 7353  Progress: 3076 on 7353  Progress: 3077 on 7353  Progress: 3078 on 7353  Progress: 3079 on 7353  Progress: 3080 on 7353  Progress: 3081 on 7353  Progress: 3082 on 7353  Progress: 3083 on 7353  Progress: 3084 on 7353  Progress: 3085 on 7353  Progress: 3086 on 7353  Progress: 3087 on 7353  Progress: 3088 on 7353  Progress: 3089 on 7353  Progress: 3090 on 7353  Progress: 3091 on 7353  Progress: 3092 on 7353  Progress: 3093 on 7353  Progress: 3094 on 7353  Progress: 3095 on 7353  Progress: 3096 on 7353  Progress: 3097 on 7353  Progress: 3098 on 7353  Progress: 3099 on 7353  Progress: 3100 on 7353  Progress: 3101 on 7353  Progress: 3102 on 7353  Progress: 3103 on 7353  Progress: 3104 on 7353  Progress: 3105 on 7353  Progress: 3106 on 7353  Progress: 3107 on 7353  Progress: 3108 on 7353  Progress: 3109 on 7353  Progress: 3110 on 7353  Progress: 3111 on 7353  Progress: 3112 on 7353  Progress: 3113 on 7353  Progress: 3114 on 7353  Progress: 3115 on 7353  Progress: 3116 on 7353  Progress: 3117 on 7353  Progress: 3118 on 7353  Progress: 3119 on 7353  Progress: 3120 on 7353  Progress: 3121 on 7353  Progress: 3122 on 7353  Progress: 3123 on 7353  Progress: 3124 on 7353  Progress: 3125 on 7353  Progress: 3126 on 7353  Progress: 3127 on 7353  Progress: 3128 on 7353  Progress: 3129 on 7353  Progress: 3130 on 7353  Progress: 3131 on 7353  Progress: 3132 on 7353  Progress: 3133 on 7353  Progress: 3134 on 7353  Progress: 3135 on 7353  Progress: 3136 on 7353  Progress: 3137 on 7353  Progress: 3138 on 7353  Progress: 3139 on 7353  Progress: 3140 on 7353  Progress: 3141 on 7353  Progress: 3142 on 7353  Progress: 3143 on 7353  Progress: 3144 on 7353  Progress: 3145 on 7353  Progress: 3146 on 7353  Progress: 3147 on 7353  Progress: 3148 on 7353  Progress: 3149 on 7353  Progress: 3150 on 7353  Progress: 3151 on 7353  Progress: 3152 on 7353  Progress: 3153 on 7353  Progress: 3154 on 7353  Progress: 3155 on 7353  Progress: 3156 on 7353  Progress: 3157 on 7353  Progress: 3158 on 7353  Progress: 3159 on 7353  Progress: 3160 on 7353  Progress: 3161 on 7353  Progress: 3162 on 7353  Progress: 3163 on 7353  Progress: 3164 on 7353  Progress: 3165 on 7353  Progress: 3166 on 7353  Progress: 3167 on 7353  Progress: 3168 on 7353  Progress: 3169 on 7353  Progress: 3170 on 7353  Progress: 3171 on 7353  Progress: 3172 on 7353  Progress: 3173 on 7353  Progress: 3174 on 7353  Progress: 3175 on 7353  Progress: 3176 on 7353  Progress: 3177 on 7353  Progress: 3178 on 7353  Progress: 3179 on 7353  Progress: 3180 on 7353  Progress: 3181 on 7353  Progress: 3182 on 7353  Progress: 3183 on 7353  Progress: 3184 on 7353  Progress: 3185 on 7353  Progress: 3186 on 7353  Progress: 3187 on 7353  Progress: 3188 on 7353  Progress: 3189 on 7353  Progress: 3190 on 7353  Progress: 3191 on 7353  Progress: 3192 on 7353  Progress: 3193 on 7353  Progress: 3194 on 7353  Progress: 3195 on 7353  Progress: 3196 on 7353  Progress: 3197 on 7353  Progress: 3198 on 7353  Progress: 3199 on 7353  Progress: 3200 on 7353  Progress: 3201 on 7353  Progress: 3202 on 7353  Progress: 3203 on 7353  Progress: 3204 on 7353  Progress: 3205 on 7353  Progress: 3206 on 7353  Progress: 3207 on 7353  Progress: 3208 on 7353  Progress: 3209 on 7353  Progress: 3210 on 7353  Progress: 3211 on 7353  Progress: 3212 on 7353  Progress: 3213 on 7353  Progress: 3214 on 7353  Progress: 3215 on 7353  Progress: 3216 on 7353  Progress: 3217 on 7353  Progress: 3218 on 7353  Progress: 3219 on 7353  Progress: 3220 on 7353  Progress: 3221 on 7353  Progress: 3222 on 7353  Progress: 3223 on 7353  Progress: 3224 on 7353  Progress: 3225 on 7353  Progress: 3226 on 7353  Progress: 3227 on 7353  Progress: 3228 on 7353  Progress: 3229 on 7353  Progress: 3230 on 7353  Progress: 3231 on 7353  Progress: 3232 on 7353  Progress: 3233 on 7353  Progress: 3234 on 7353  Progress: 3235 on 7353  Progress: 3236 on 7353  Progress: 3237 on 7353  Progress: 3238 on 7353  Progress: 3239 on 7353  Progress: 3240 on 7353  Progress: 3241 on 7353  Progress: 3242 on 7353  Progress: 3243 on 7353  Progress: 3244 on 7353  Progress: 3245 on 7353  Progress: 3246 on 7353  Progress: 3247 on 7353  Progress: 3248 on 7353  Progress: 3249 on 7353  Progress: 3250 on 7353  Progress: 3251 on 7353  Progress: 3252 on 7353  Progress: 3253 on 7353  Progress: 3254 on 7353  Progress: 3255 on 7353  Progress: 3256 on 7353  Progress: 3257 on 7353  Progress: 3258 on 7353  Progress: 3259 on 7353  Progress: 3260 on 7353  Progress: 3261 on 7353  Progress: 3262 on 7353  Progress: 3263 on 7353  Progress: 3264 on 7353  Progress: 3265 on 7353  Progress: 3266 on 7353  Progress: 3267 on 7353  Progress: 3268 on 7353  Progress: 3269 on 7353  Progress: 3270 on 7353  Progress: 3271 on 7353  Progress: 3272 on 7353  Progress: 3273 on 7353  Progress: 3274 on 7353  Progress: 3275 on 7353  Progress: 3276 on 7353  Progress: 3277 on 7353  Progress: 3278 on 7353  Progress: 3279 on 7353  Progress: 3280 on 7353  Progress: 3281 on 7353  Progress: 3282 on 7353  Progress: 3283 on 7353  Progress: 3284 on 7353  Progress: 3285 on 7353  Progress: 3286 on 7353  Progress: 3287 on 7353  Progress: 3288 on 7353  Progress: 3289 on 7353  Progress: 3290 on 7353  Progress: 3291 on 7353  Progress: 3292 on 7353  Progress: 3293 on 7353  Progress: 3294 on 7353  Progress: 3295 on 7353  Progress: 3296 on 7353  Progress: 3297 on 7353  Progress: 3298 on 7353  Progress: 3299 on 7353  Progress: 3300 on 7353  Progress: 3301 on 7353  Progress: 3302 on 7353  Progress: 3303 on 7353  Progress: 3304 on 7353  Progress: 3305 on 7353  Progress: 3306 on 7353  Progress: 3307 on 7353  Progress: 3308 on 7353  Progress: 3309 on 7353  Progress: 3310 on 7353  Progress: 3311 on 7353  Progress: 3312 on 7353  Progress: 3313 on 7353  Progress: 3314 on 7353  Progress: 3315 on 7353  Progress: 3316 on 7353  Progress: 3317 on 7353  Progress: 3318 on 7353  Progress: 3319 on 7353  Progress: 3320 on 7353  Progress: 3321 on 7353  Progress: 3322 on 7353  Progress: 3323 on 7353  Progress: 3324 on 7353  Progress: 3325 on 7353  Progress: 3326 on 7353  Progress: 3327 on 7353  Progress: 3328 on 7353  Progress: 3329 on 7353  Progress: 3330 on 7353  Progress: 3331 on 7353  Progress: 3332 on 7353  Progress: 3333 on 7353  Progress: 3334 on 7353  Progress: 3335 on 7353  Progress: 3336 on 7353  Progress: 3337 on 7353  Progress: 3338 on 7353  Progress: 3339 on 7353  Progress: 3340 on 7353  Progress: 3341 on 7353  Progress: 3342 on 7353  Progress: 3343 on 7353  Progress: 3344 on 7353  Progress: 3345 on 7353  Progress: 3346 on 7353  Progress: 3347 on 7353  Progress: 3348 on 7353  Progress: 3349 on 7353  Progress: 3350 on 7353  Progress: 3351 on 7353  Progress: 3352 on 7353  Progress: 3353 on 7353  Progress: 3354 on 7353  Progress: 3355 on 7353  Progress: 3356 on 7353  Progress: 3357 on 7353  Progress: 3358 on 7353  Progress: 3359 on 7353  Progress: 3360 on 7353  Progress: 3361 on 7353  Progress: 3362 on 7353  Progress: 3363 on 7353  Progress: 3364 on 7353  Progress: 3365 on 7353  Progress: 3366 on 7353  Progress: 3367 on 7353  Progress: 3368 on 7353  Progress: 3369 on 7353  Progress: 3370 on 7353  Progress: 3371 on 7353  Progress: 3372 on 7353  Progress: 3373 on 7353  Progress: 3374 on 7353  Progress: 3375 on 7353  Progress: 3376 on 7353  Progress: 3377 on 7353  Progress: 3378 on 7353  Progress: 3379 on 7353  Progress: 3380 on 7353  Progress: 3381 on 7353  Progress: 3382 on 7353  Progress: 3383 on 7353  Progress: 3384 on 7353  Progress: 3385 on 7353  Progress: 3386 on 7353  Progress: 3387 on 7353  Progress: 3388 on 7353  Progress: 3389 on 7353  Progress: 3390 on 7353  Progress: 3391 on 7353  Progress: 3392 on 7353  Progress: 3393 on 7353  Progress: 3394 on 7353  Progress: 3395 on 7353  Progress: 3396 on 7353  Progress: 3397 on 7353  Progress: 3398 on 7353  Progress: 3399 on 7353  Progress: 3400 on 7353  Progress: 3401 on 7353  Progress: 3402 on 7353  Progress: 3403 on 7353  Progress: 3404 on 7353  Progress: 3405 on 7353  Progress: 3406 on 7353  Progress: 3407 on 7353  Progress: 3408 on 7353  Progress: 3409 on 7353  Progress: 3410 on 7353  Progress: 3411 on 7353  Progress: 3412 on 7353  Progress: 3413 on 7353  Progress: 3414 on 7353  Progress: 3415 on 7353  Progress: 3416 on 7353  Progress: 3417 on 7353  Progress: 3418 on 7353  Progress: 3419 on 7353  Progress: 3420 on 7353  Progress: 3421 on 7353  Progress: 3422 on 7353  Progress: 3423 on 7353  Progress: 3424 on 7353  Progress: 3425 on 7353  Progress: 3426 on 7353  Progress: 3427 on 7353  Progress: 3428 on 7353  Progress: 3429 on 7353  Progress: 3430 on 7353  Progress: 3431 on 7353  Progress: 3432 on 7353  Progress: 3433 on 7353  Progress: 3434 on 7353  Progress: 3435 on 7353  Progress: 3436 on 7353  Progress: 3437 on 7353  Progress: 3438 on 7353  Progress: 3439 on 7353  Progress: 3440 on 7353  Progress: 3441 on 7353  Progress: 3442 on 7353  Progress: 3443 on 7353  Progress: 3444 on 7353  Progress: 3445 on 7353  Progress: 3446 on 7353  Progress: 3447 on 7353  Progress: 3448 on 7353  Progress: 3449 on 7353  Progress: 3450 on 7353  Progress: 3451 on 7353  Progress: 3452 on 7353  Progress: 3453 on 7353  Progress: 3454 on 7353  Progress: 3455 on 7353  Progress: 3456 on 7353  Progress: 3457 on 7353  Progress: 3458 on 7353  Progress: 3459 on 7353  Progress: 3460 on 7353  Progress: 3461 on 7353  Progress: 3462 on 7353  Progress: 3463 on 7353  Progress: 3464 on 7353  Progress: 3465 on 7353  Progress: 3466 on 7353  Progress: 3467 on 7353  Progress: 3468 on 7353  Progress: 3469 on 7353  Progress: 3470 on 7353  Progress: 3471 on 7353  Progress: 3472 on 7353  Progress: 3473 on 7353  Progress: 3474 on 7353  Progress: 3475 on 7353  Progress: 3476 on 7353  Progress: 3477 on 7353  Progress: 3478 on 7353  Progress: 3479 on 7353  Progress: 3480 on 7353  Progress: 3481 on 7353  Progress: 3482 on 7353  Progress: 3483 on 7353  Progress: 3484 on 7353  Progress: 3485 on 7353  Progress: 3486 on 7353  Progress: 3487 on 7353  Progress: 3488 on 7353  Progress: 3489 on 7353  Progress: 3490 on 7353  Progress: 3491 on 7353  Progress: 3492 on 7353  Progress: 3493 on 7353  Progress: 3494 on 7353  Progress: 3495 on 7353  Progress: 3496 on 7353  Progress: 3497 on 7353  Progress: 3498 on 7353  Progress: 3499 on 7353  Progress: 3500 on 7353  Progress: 3501 on 7353  Progress: 3502 on 7353  Progress: 3503 on 7353  Progress: 3504 on 7353  Progress: 3505 on 7353  Progress: 3506 on 7353  Progress: 3507 on 7353  Progress: 3508 on 7353  Progress: 3509 on 7353  Progress: 3510 on 7353  Progress: 3511 on 7353  Progress: 3512 on 7353  Progress: 3513 on 7353  Progress: 3514 on 7353  Progress: 3515 on 7353  Progress: 3516 on 7353  Progress: 3517 on 7353  Progress: 3518 on 7353  Progress: 3519 on 7353  Progress: 3520 on 7353  Progress: 3521 on 7353  Progress: 3522 on 7353  Progress: 3523 on 7353  Progress: 3524 on 7353  Progress: 3525 on 7353  Progress: 3526 on 7353  Progress: 3527 on 7353  Progress: 3528 on 7353  Progress: 3529 on 7353  Progress: 3530 on 7353  Progress: 3531 on 7353  Progress: 3532 on 7353  Progress: 3533 on 7353  Progress: 3534 on 7353  Progress: 3535 on 7353  Progress: 3536 on 7353  Progress: 3537 on 7353  Progress: 3538 on 7353  Progress: 3539 on 7353  Progress: 3540 on 7353  Progress: 3541 on 7353  Progress: 3542 on 7353  Progress: 3543 on 7353  Progress: 3544 on 7353  Progress: 3545 on 7353  Progress: 3546 on 7353  Progress: 3547 on 7353  Progress: 3548 on 7353  Progress: 3549 on 7353  Progress: 3550 on 7353  Progress: 3551 on 7353  Progress: 3552 on 7353  Progress: 3553 on 7353  Progress: 3554 on 7353  Progress: 3555 on 7353  Progress: 3556 on 7353  Progress: 3557 on 7353  Progress: 3558 on 7353  Progress: 3559 on 7353  Progress: 3560 on 7353  Progress: 3561 on 7353  Progress: 3562 on 7353  Progress: 3563 on 7353  Progress: 3564 on 7353  Progress: 3565 on 7353  Progress: 3566 on 7353  Progress: 3567 on 7353  Progress: 3568 on 7353  Progress: 3569 on 7353  Progress: 3570 on 7353  Progress: 3571 on 7353  Progress: 3572 on 7353  Progress: 3573 on 7353  Progress: 3574 on 7353  Progress: 3575 on 7353  Progress: 3576 on 7353  Progress: 3577 on 7353  Progress: 3578 on 7353  Progress: 3579 on 7353  Progress: 3580 on 7353  Progress: 3581 on 7353  Progress: 3582 on 7353  Progress: 3583 on 7353  Progress: 3584 on 7353  Progress: 3585 on 7353  Progress: 3586 on 7353  Progress: 3587 on 7353  Progress: 3588 on 7353  Progress: 3589 on 7353  Progress: 3590 on 7353  Progress: 3591 on 7353  Progress: 3592 on 7353  Progress: 3593 on 7353  Progress: 3594 on 7353  Progress: 3595 on 7353  Progress: 3596 on 7353  Progress: 3597 on 7353  Progress: 3598 on 7353  Progress: 3599 on 7353  Progress: 3600 on 7353  Progress: 3601 on 7353  Progress: 3602 on 7353  Progress: 3603 on 7353  Progress: 3604 on 7353  Progress: 3605 on 7353  Progress: 3606 on 7353  Progress: 3607 on 7353  Progress: 3608 on 7353  Progress: 3609 on 7353  Progress: 3610 on 7353  Progress: 3611 on 7353  Progress: 3612 on 7353  Progress: 3613 on 7353  Progress: 3614 on 7353  Progress: 3615 on 7353  Progress: 3616 on 7353  Progress: 3617 on 7353  Progress: 3618 on 7353  Progress: 3619 on 7353  Progress: 3620 on 7353  Progress: 3621 on 7353  Progress: 3622 on 7353  Progress: 3623 on 7353  Progress: 3624 on 7353  Progress: 3625 on 7353  Progress: 3626 on 7353  Progress: 3627 on 7353  Progress: 3628 on 7353  Progress: 3629 on 7353  Progress: 3630 on 7353  Progress: 3631 on 7353  Progress: 3632 on 7353  Progress: 3633 on 7353  Progress: 3634 on 7353  Progress: 3635 on 7353  Progress: 3636 on 7353  Progress: 3637 on 7353  Progress: 3638 on 7353  Progress: 3639 on 7353  Progress: 3640 on 7353  Progress: 3641 on 7353  Progress: 3642 on 7353  Progress: 3643 on 7353  Progress: 3644 on 7353  Progress: 3645 on 7353  Progress: 3646 on 7353  Progress: 3647 on 7353  Progress: 3648 on 7353  Progress: 3649 on 7353  Progress: 3650 on 7353  Progress: 3651 on 7353  Progress: 3652 on 7353  Progress: 3653 on 7353  Progress: 3654 on 7353  Progress: 3655 on 7353  Progress: 3656 on 7353  Progress: 3657 on 7353  Progress: 3658 on 7353  Progress: 3659 on 7353  Progress: 3660 on 7353  Progress: 3661 on 7353  Progress: 3662 on 7353  Progress: 3663 on 7353  Progress: 3664 on 7353  Progress: 3665 on 7353  Progress: 3666 on 7353  Progress: 3667 on 7353  Progress: 3668 on 7353  Progress: 3669 on 7353  Progress: 3670 on 7353  Progress: 3671 on 7353  Progress: 3672 on 7353  Progress: 3673 on 7353  Progress: 3674 on 7353  Progress: 3675 on 7353  Progress: 3676 on 7353  Progress: 3677 on 7353  Progress: 3678 on 7353  Progress: 3679 on 7353  Progress: 3680 on 7353  Progress: 3681 on 7353  Progress: 3682 on 7353  Progress: 3683 on 7353  Progress: 3684 on 7353  Progress: 3685 on 7353  Progress: 3686 on 7353  Progress: 3687 on 7353  Progress: 3688 on 7353  Progress: 3689 on 7353  Progress: 3690 on 7353  Progress: 3691 on 7353  Progress: 3692 on 7353  Progress: 3693 on 7353  Progress: 3694 on 7353  Progress: 3695 on 7353  Progress: 3696 on 7353  Progress: 3697 on 7353  Progress: 3698 on 7353  Progress: 3699 on 7353  Progress: 3700 on 7353  Progress: 3701 on 7353  Progress: 3702 on 7353  Progress: 3703 on 7353  Progress: 3704 on 7353  Progress: 3705 on 7353  Progress: 3706 on 7353  Progress: 3707 on 7353  Progress: 3708 on 7353  Progress: 3709 on 7353  Progress: 3710 on 7353  Progress: 3711 on 7353  Progress: 3712 on 7353  Progress: 3713 on 7353  Progress: 3714 on 7353  Progress: 3715 on 7353  Progress: 3716 on 7353  Progress: 3717 on 7353  Progress: 3718 on 7353  Progress: 3719 on 7353  Progress: 3720 on 7353  Progress: 3721 on 7353  Progress: 3722 on 7353  Progress: 3723 on 7353  Progress: 3724 on 7353  Progress: 3725 on 7353  Progress: 3726 on 7353  Progress: 3727 on 7353  Progress: 3728 on 7353  Progress: 3729 on 7353  Progress: 3730 on 7353  Progress: 3731 on 7353  Progress: 3732 on 7353  Progress: 3733 on 7353  Progress: 3734 on 7353  Progress: 3735 on 7353  Progress: 3736 on 7353  Progress: 3737 on 7353  Progress: 3738 on 7353  Progress: 3739 on 7353  Progress: 3740 on 7353  Progress: 3741 on 7353  Progress: 3742 on 7353  Progress: 3743 on 7353  Progress: 3744 on 7353  Progress: 3745 on 7353  Progress: 3746 on 7353  Progress: 3747 on 7353  Progress: 3748 on 7353  Progress: 3749 on 7353  Progress: 3750 on 7353  Progress: 3751 on 7353  Progress: 3752 on 7353  Progress: 3753 on 7353  Progress: 3754 on 7353  Progress: 3755 on 7353  Progress: 3756 on 7353  Progress: 3757 on 7353  Progress: 3758 on 7353  Progress: 3759 on 7353  Progress: 3760 on 7353  Progress: 3761 on 7353  Progress: 3762 on 7353  Progress: 3763 on 7353  Progress: 3764 on 7353  Progress: 3765 on 7353  Progress: 3766 on 7353  Progress: 3767 on 7353  Progress: 3768 on 7353  Progress: 3769 on 7353  Progress: 3770 on 7353  Progress: 3771 on 7353  Progress: 3772 on 7353  Progress: 3773 on 7353  Progress: 3774 on 7353  Progress: 3775 on 7353  Progress: 3776 on 7353  Progress: 3777 on 7353  Progress: 3778 on 7353  Progress: 3779 on 7353  Progress: 3780 on 7353  Progress: 3781 on 7353  Progress: 3782 on 7353  Progress: 3783 on 7353  Progress: 3784 on 7353  Progress: 3785 on 7353  Progress: 3786 on 7353  Progress: 3787 on 7353  Progress: 3788 on 7353  Progress: 3789 on 7353  Progress: 3790 on 7353  Progress: 3791 on 7353  Progress: 3792 on 7353  Progress: 3793 on 7353  Progress: 3794 on 7353  Progress: 3795 on 7353  Progress: 3796 on 7353  Progress: 3797 on 7353  Progress: 3798 on 7353  Progress: 3799 on 7353  Progress: 3800 on 7353  Progress: 3801 on 7353  Progress: 3802 on 7353  Progress: 3803 on 7353  Progress: 3804 on 7353  Progress: 3805 on 7353  Progress: 3806 on 7353  Progress: 3807 on 7353  Progress: 3808 on 7353  Progress: 3809 on 7353  Progress: 3810 on 7353  Progress: 3811 on 7353  Progress: 3812 on 7353  Progress: 3813 on 7353  Progress: 3814 on 7353  Progress: 3815 on 7353  Progress: 3816 on 7353  Progress: 3817 on 7353  Progress: 3818 on 7353  Progress: 3819 on 7353  Progress: 3820 on 7353  Progress: 3821 on 7353  Progress: 3822 on 7353  Progress: 3823 on 7353  Progress: 3824 on 7353  Progress: 3825 on 7353  Progress: 3826 on 7353  Progress: 3827 on 7353  Progress: 3828 on 7353  Progress: 3829 on 7353  Progress: 3830 on 7353  Progress: 3831 on 7353  Progress: 3832 on 7353  Progress: 3833 on 7353  Progress: 3834 on 7353  Progress: 3835 on 7353  Progress: 3836 on 7353  Progress: 3837 on 7353  Progress: 3838 on 7353  Progress: 3839 on 7353  Progress: 3840 on 7353  Progress: 3841 on 7353  Progress: 3842 on 7353  Progress: 3843 on 7353  Progress: 3844 on 7353  Progress: 3845 on 7353  Progress: 3846 on 7353  Progress: 3847 on 7353  Progress: 3848 on 7353  Progress: 3849 on 7353  Progress: 3850 on 7353  Progress: 3851 on 7353  Progress: 3852 on 7353  Progress: 3853 on 7353  Progress: 3854 on 7353  Progress: 3855 on 7353  Progress: 3856 on 7353  Progress: 3857 on 7353  Progress: 3858 on 7353  Progress: 3859 on 7353  Progress: 3860 on 7353  Progress: 3861 on 7353  Progress: 3862 on 7353  Progress: 3863 on 7353  Progress: 3864 on 7353  Progress: 3865 on 7353  Progress: 3866 on 7353  Progress: 3867 on 7353  Progress: 3868 on 7353  Progress: 3869 on 7353  Progress: 3870 on 7353  Progress: 3871 on 7353  Progress: 3872 on 7353  Progress: 3873 on 7353  Progress: 3874 on 7353  Progress: 3875 on 7353  Progress: 3876 on 7353  Progress: 3877 on 7353  Progress: 3878 on 7353  Progress: 3879 on 7353  Progress: 3880 on 7353  Progress: 3881 on 7353  Progress: 3882 on 7353  Progress: 3883 on 7353  Progress: 3884 on 7353  Progress: 3885 on 7353  Progress: 3886 on 7353  Progress: 3887 on 7353  Progress: 3888 on 7353  Progress: 3889 on 7353  Progress: 3890 on 7353  Progress: 3891 on 7353  Progress: 3892 on 7353  Progress: 3893 on 7353  Progress: 3894 on 7353  Progress: 3895 on 7353  Progress: 3896 on 7353  Progress: 3897 on 7353  Progress: 3898 on 7353  Progress: 3899 on 7353  Progress: 3900 on 7353  Progress: 3901 on 7353  Progress: 3902 on 7353  Progress: 3903 on 7353  Progress: 3904 on 7353  Progress: 3905 on 7353  Progress: 3906 on 7353  Progress: 3907 on 7353  Progress: 3908 on 7353  Progress: 3909 on 7353  Progress: 3910 on 7353  Progress: 3911 on 7353  Progress: 3912 on 7353  Progress: 3913 on 7353  Progress: 3914 on 7353  Progress: 3915 on 7353  Progress: 3916 on 7353  Progress: 3917 on 7353  Progress: 3918 on 7353  Progress: 3919 on 7353  Progress: 3920 on 7353  Progress: 3921 on 7353  Progress: 3922 on 7353  Progress: 3923 on 7353  Progress: 3924 on 7353  Progress: 3925 on 7353  Progress: 3926 on 7353  Progress: 3927 on 7353  Progress: 3928 on 7353  Progress: 3929 on 7353  Progress: 3930 on 7353  Progress: 3931 on 7353  Progress: 3932 on 7353  Progress: 3933 on 7353  Progress: 3934 on 7353  Progress: 3935 on 7353  Progress: 3936 on 7353  Progress: 3937 on 7353  Progress: 3938 on 7353  Progress: 3939 on 7353  Progress: 3940 on 7353  Progress: 3941 on 7353  Progress: 3942 on 7353  Progress: 3943 on 7353  Progress: 3944 on 7353  Progress: 3945 on 7353  Progress: 3946 on 7353  Progress: 3947 on 7353  Progress: 3948 on 7353  Progress: 3949 on 7353  Progress: 3950 on 7353  Progress: 3951 on 7353  Progress: 3952 on 7353  Progress: 3953 on 7353  Progress: 3954 on 7353  Progress: 3955 on 7353  Progress: 3956 on 7353  Progress: 3957 on 7353  Progress: 3958 on 7353  Progress: 3959 on 7353  Progress: 3960 on 7353  Progress: 3961 on 7353  Progress: 3962 on 7353  Progress: 3963 on 7353  Progress: 3964 on 7353  Progress: 3965 on 7353  Progress: 3966 on 7353  Progress: 3967 on 7353  Progress: 3968 on 7353  Progress: 3969 on 7353  Progress: 3970 on 7353  Progress: 3971 on 7353  Progress: 3972 on 7353  Progress: 3973 on 7353  Progress: 3974 on 7353  Progress: 3975 on 7353  Progress: 3976 on 7353  Progress: 3977 on 7353  Progress: 3978 on 7353  Progress: 3979 on 7353  Progress: 3980 on 7353  Progress: 3981 on 7353  Progress: 3982 on 7353  Progress: 3983 on 7353  Progress: 3984 on 7353  Progress: 3985 on 7353  Progress: 3986 on 7353  Progress: 3987 on 7353  Progress: 3988 on 7353  Progress: 3989 on 7353  Progress: 3990 on 7353  Progress: 3991 on 7353  Progress: 3992 on 7353  Progress: 3993 on 7353  Progress: 3994 on 7353  Progress: 3995 on 7353  Progress: 3996 on 7353  Progress: 3997 on 7353  Progress: 3998 on 7353  Progress: 3999 on 7353  Progress: 4000 on 7353  Progress: 4001 on 7353  Progress: 4002 on 7353  Progress: 4003 on 7353  Progress: 4004 on 7353  Progress: 4005 on 7353  Progress: 4006 on 7353  Progress: 4007 on 7353  Progress: 4008 on 7353  Progress: 4009 on 7353  Progress: 4010 on 7353  Progress: 4011 on 7353  Progress: 4012 on 7353  Progress: 4013 on 7353  Progress: 4014 on 7353  Progress: 4015 on 7353  Progress: 4016 on 7353  Progress: 4017 on 7353  Progress: 4018 on 7353  Progress: 4019 on 7353  Progress: 4020 on 7353  Progress: 4021 on 7353  Progress: 4022 on 7353  Progress: 4023 on 7353  Progress: 4024 on 7353  Progress: 4025 on 7353  Progress: 4026 on 7353  Progress: 4027 on 7353  Progress: 4028 on 7353  Progress: 4029 on 7353  Progress: 4030 on 7353  Progress: 4031 on 7353  Progress: 4032 on 7353  Progress: 4033 on 7353  Progress: 4034 on 7353  Progress: 4035 on 7353  Progress: 4036 on 7353  Progress: 4037 on 7353  Progress: 4038 on 7353  Progress: 4039 on 7353  Progress: 4040 on 7353  Progress: 4041 on 7353  Progress: 4042 on 7353  Progress: 4043 on 7353  Progress: 4044 on 7353  Progress: 4045 on 7353  Progress: 4046 on 7353  Progress: 4047 on 7353  Progress: 4048 on 7353  Progress: 4049 on 7353  Progress: 4050 on 7353  Progress: 4051 on 7353  Progress: 4052 on 7353  Progress: 4053 on 7353  Progress: 4054 on 7353  Progress: 4055 on 7353  Progress: 4056 on 7353  Progress: 4057 on 7353  Progress: 4058 on 7353  Progress: 4059 on 7353  Progress: 4060 on 7353  Progress: 4061 on 7353  Progress: 4062 on 7353  Progress: 4063 on 7353  Progress: 4064 on 7353  Progress: 4065 on 7353  Progress: 4066 on 7353  Progress: 4067 on 7353  Progress: 4068 on 7353  Progress: 4069 on 7353  Progress: 4070 on 7353  Progress: 4071 on 7353  Progress: 4072 on 7353  Progress: 4073 on 7353  Progress: 4074 on 7353  Progress: 4075 on 7353  Progress: 4076 on 7353  Progress: 4077 on 7353  Progress: 4078 on 7353  Progress: 4079 on 7353  Progress: 4080 on 7353  Progress: 4081 on 7353  Progress: 4082 on 7353  Progress: 4083 on 7353  Progress: 4084 on 7353  Progress: 4085 on 7353  Progress: 4086 on 7353  Progress: 4087 on 7353  Progress: 4088 on 7353  Progress: 4089 on 7353  Progress: 4090 on 7353  Progress: 4091 on 7353  Progress: 4092 on 7353  Progress: 4093 on 7353  Progress: 4094 on 7353  Progress: 4095 on 7353  Progress: 4096 on 7353  Progress: 4097 on 7353  Progress: 4098 on 7353  Progress: 4099 on 7353  Progress: 4100 on 7353  Progress: 4101 on 7353  Progress: 4102 on 7353  Progress: 4103 on 7353  Progress: 4104 on 7353  Progress: 4105 on 7353  Progress: 4106 on 7353  Progress: 4107 on 7353  Progress: 4108 on 7353  Progress: 4109 on 7353  Progress: 4110 on 7353  Progress: 4111 on 7353  Progress: 4112 on 7353  Progress: 4113 on 7353  Progress: 4114 on 7353  Progress: 4115 on 7353  Progress: 4116 on 7353  Progress: 4117 on 7353  Progress: 4118 on 7353  Progress: 4119 on 7353  Progress: 4120 on 7353  Progress: 4121 on 7353  Progress: 4122 on 7353  Progress: 4123 on 7353  Progress: 4124 on 7353  Progress: 4125 on 7353  Progress: 4126 on 7353  Progress: 4127 on 7353  Progress: 4128 on 7353  Progress: 4129 on 7353  Progress: 4130 on 7353  Progress: 4131 on 7353  Progress: 4132 on 7353  Progress: 4133 on 7353  Progress: 4134 on 7353  Progress: 4135 on 7353  Progress: 4136 on 7353  Progress: 4137 on 7353  Progress: 4138 on 7353  Progress: 4139 on 7353  Progress: 4140 on 7353  Progress: 4141 on 7353  Progress: 4142 on 7353  Progress: 4143 on 7353  Progress: 4144 on 7353  Progress: 4145 on 7353  Progress: 4146 on 7353  Progress: 4147 on 7353  Progress: 4148 on 7353  Progress: 4149 on 7353  Progress: 4150 on 7353  Progress: 4151 on 7353  Progress: 4152 on 7353  Progress: 4153 on 7353  Progress: 4154 on 7353  Progress: 4155 on 7353  Progress: 4156 on 7353  Progress: 4157 on 7353  Progress: 4158 on 7353  Progress: 4159 on 7353  Progress: 4160 on 7353  Progress: 4161 on 7353  Progress: 4162 on 7353  Progress: 4163 on 7353  Progress: 4164 on 7353  Progress: 4165 on 7353  Progress: 4166 on 7353  Progress: 4167 on 7353  Progress: 4168 on 7353  Progress: 4169 on 7353  Progress: 4170 on 7353  Progress: 4171 on 7353  Progress: 4172 on 7353  Progress: 4173 on 7353  Progress: 4174 on 7353  Progress: 4175 on 7353  Progress: 4176 on 7353  Progress: 4177 on 7353  Progress: 4178 on 7353  Progress: 4179 on 7353  Progress: 4180 on 7353  Progress: 4181 on 7353  Progress: 4182 on 7353  Progress: 4183 on 7353  Progress: 4184 on 7353  Progress: 4185 on 7353  Progress: 4186 on 7353  Progress: 4187 on 7353  Progress: 4188 on 7353  Progress: 4189 on 7353  Progress: 4190 on 7353  Progress: 4191 on 7353  Progress: 4192 on 7353  Progress: 4193 on 7353  Progress: 4194 on 7353  Progress: 4195 on 7353  Progress: 4196 on 7353  Progress: 4197 on 7353  Progress: 4198 on 7353  Progress: 4199 on 7353  Progress: 4200 on 7353  Progress: 4201 on 7353  Progress: 4202 on 7353  Progress: 4203 on 7353  Progress: 4204 on 7353  Progress: 4205 on 7353  Progress: 4206 on 7353  Progress: 4207 on 7353  Progress: 4208 on 7353  Progress: 4209 on 7353  Progress: 4210 on 7353  Progress: 4211 on 7353  Progress: 4212 on 7353  Progress: 4213 on 7353  Progress: 4214 on 7353  Progress: 4215 on 7353  Progress: 4216 on 7353  Progress: 4217 on 7353  Progress: 4218 on 7353  Progress: 4219 on 7353  Progress: 4220 on 7353  Progress: 4221 on 7353  Progress: 4222 on 7353  Progress: 4223 on 7353  Progress: 4224 on 7353  Progress: 4225 on 7353  Progress: 4226 on 7353  Progress: 4227 on 7353  Progress: 4228 on 7353  Progress: 4229 on 7353  Progress: 4230 on 7353  Progress: 4231 on 7353  Progress: 4232 on 7353  Progress: 4233 on 7353  Progress: 4234 on 7353  Progress: 4235 on 7353  Progress: 4236 on 7353  Progress: 4237 on 7353  Progress: 4238 on 7353  Progress: 4239 on 7353  Progress: 4240 on 7353  Progress: 4241 on 7353  Progress: 4242 on 7353  Progress: 4243 on 7353  Progress: 4244 on 7353  Progress: 4245 on 7353  Progress: 4246 on 7353  Progress: 4247 on 7353  Progress: 4248 on 7353  Progress: 4249 on 7353  Progress: 4250 on 7353  Progress: 4251 on 7353  Progress: 4252 on 7353  Progress: 4253 on 7353  Progress: 4254 on 7353  Progress: 4255 on 7353  Progress: 4256 on 7353  Progress: 4257 on 7353  Progress: 4258 on 7353  Progress: 4259 on 7353  Progress: 4260 on 7353  Progress: 4261 on 7353  Progress: 4262 on 7353  Progress: 4263 on 7353  Progress: 4264 on 7353  Progress: 4265 on 7353  Progress: 4266 on 7353  Progress: 4267 on 7353  Progress: 4268 on 7353  Progress: 4269 on 7353  Progress: 4270 on 7353  Progress: 4271 on 7353  Progress: 4272 on 7353  Progress: 4273 on 7353  Progress: 4274 on 7353  Progress: 4275 on 7353  Progress: 4276 on 7353  Progress: 4277 on 7353  Progress: 4278 on 7353  Progress: 4279 on 7353  Progress: 4280 on 7353  Progress: 4281 on 7353  Progress: 4282 on 7353  Progress: 4283 on 7353  Progress: 4284 on 7353  Progress: 4285 on 7353  Progress: 4286 on 7353  Progress: 4287 on 7353  Progress: 4288 on 7353  Progress: 4289 on 7353  Progress: 4290 on 7353  Progress: 4291 on 7353  Progress: 4292 on 7353  Progress: 4293 on 7353  Progress: 4294 on 7353  Progress: 4295 on 7353  Progress: 4296 on 7353  Progress: 4297 on 7353  Progress: 4298 on 7353  Progress: 4299 on 7353  Progress: 4300 on 7353  Progress: 4301 on 7353  Progress: 4302 on 7353  Progress: 4303 on 7353  Progress: 4304 on 7353  Progress: 4305 on 7353  Progress: 4306 on 7353  Progress: 4307 on 7353  Progress: 4308 on 7353  Progress: 4309 on 7353  Progress: 4310 on 7353  Progress: 4311 on 7353  Progress: 4312 on 7353  Progress: 4313 on 7353  Progress: 4314 on 7353  Progress: 4315 on 7353  Progress: 4316 on 7353  Progress: 4317 on 7353  Progress: 4318 on 7353  Progress: 4319 on 7353  Progress: 4320 on 7353  Progress: 4321 on 7353  Progress: 4322 on 7353  Progress: 4323 on 7353  Progress: 4324 on 7353  Progress: 4325 on 7353  Progress: 4326 on 7353  Progress: 4327 on 7353  Progress: 4328 on 7353  Progress: 4329 on 7353  Progress: 4330 on 7353  Progress: 4331 on 7353  Progress: 4332 on 7353  Progress: 4333 on 7353  Progress: 4334 on 7353  Progress: 4335 on 7353  Progress: 4336 on 7353  Progress: 4337 on 7353  Progress: 4338 on 7353  Progress: 4339 on 7353  Progress: 4340 on 7353  Progress: 4341 on 7353  Progress: 4342 on 7353  Progress: 4343 on 7353  Progress: 4344 on 7353  Progress: 4345 on 7353  Progress: 4346 on 7353  Progress: 4347 on 7353  Progress: 4348 on 7353  Progress: 4349 on 7353  Progress: 4350 on 7353  Progress: 4351 on 7353  Progress: 4352 on 7353  Progress: 4353 on 7353  Progress: 4354 on 7353  Progress: 4355 on 7353  Progress: 4356 on 7353  Progress: 4357 on 7353  Progress: 4358 on 7353  Progress: 4359 on 7353  Progress: 4360 on 7353  Progress: 4361 on 7353  Progress: 4362 on 7353  Progress: 4363 on 7353  Progress: 4364 on 7353  Progress: 4365 on 7353  Progress: 4366 on 7353  Progress: 4367 on 7353  Progress: 4368 on 7353  Progress: 4369 on 7353  Progress: 4370 on 7353  Progress: 4371 on 7353  Progress: 4372 on 7353  Progress: 4373 on 7353  Progress: 4374 on 7353  Progress: 4375 on 7353  Progress: 4376 on 7353  Progress: 4377 on 7353  Progress: 4378 on 7353  Progress: 4379 on 7353  Progress: 4380 on 7353  Progress: 4381 on 7353  Progress: 4382 on 7353  Progress: 4383 on 7353  Progress: 4384 on 7353  Progress: 4385 on 7353  Progress: 4386 on 7353  Progress: 4387 on 7353  Progress: 4388 on 7353  Progress: 4389 on 7353  Progress: 4390 on 7353  Progress: 4391 on 7353  Progress: 4392 on 7353  Progress: 4393 on 7353  Progress: 4394 on 7353  Progress: 4395 on 7353  Progress: 4396 on 7353  Progress: 4397 on 7353  Progress: 4398 on 7353  Progress: 4399 on 7353  Progress: 4400 on 7353  Progress: 4401 on 7353  Progress: 4402 on 7353  Progress: 4403 on 7353  Progress: 4404 on 7353  Progress: 4405 on 7353  Progress: 4406 on 7353  Progress: 4407 on 7353  Progress: 4408 on 7353  Progress: 4409 on 7353  Progress: 4410 on 7353  Progress: 4411 on 7353  Progress: 4412 on 7353  Progress: 4413 on 7353  Progress: 4414 on 7353  Progress: 4415 on 7353  Progress: 4416 on 7353  Progress: 4417 on 7353  Progress: 4418 on 7353  Progress: 4419 on 7353  Progress: 4420 on 7353  Progress: 4421 on 7353  Progress: 4422 on 7353  Progress: 4423 on 7353  Progress: 4424 on 7353  Progress: 4425 on 7353  Progress: 4426 on 7353  Progress: 4427 on 7353  Progress: 4428 on 7353  Progress: 4429 on 7353  Progress: 4430 on 7353  Progress: 4431 on 7353  Progress: 4432 on 7353  Progress: 4433 on 7353  Progress: 4434 on 7353  Progress: 4435 on 7353  Progress: 4436 on 7353  Progress: 4437 on 7353  Progress: 4438 on 7353  Progress: 4439 on 7353  Progress: 4440 on 7353  Progress: 4441 on 7353  Progress: 4442 on 7353  Progress: 4443 on 7353  Progress: 4444 on 7353  Progress: 4445 on 7353  Progress: 4446 on 7353  Progress: 4447 on 7353  Progress: 4448 on 7353  Progress: 4449 on 7353  Progress: 4450 on 7353  Progress: 4451 on 7353  Progress: 4452 on 7353  Progress: 4453 on 7353  Progress: 4454 on 7353  Progress: 4455 on 7353  Progress: 4456 on 7353  Progress: 4457 on 7353  Progress: 4458 on 7353  Progress: 4459 on 7353  Progress: 4460 on 7353  Progress: 4461 on 7353  Progress: 4462 on 7353  Progress: 4463 on 7353  Progress: 4464 on 7353  Progress: 4465 on 7353  Progress: 4466 on 7353  Progress: 4467 on 7353  Progress: 4468 on 7353  Progress: 4469 on 7353  Progress: 4470 on 7353  Progress: 4471 on 7353  Progress: 4472 on 7353  Progress: 4473 on 7353  Progress: 4474 on 7353  Progress: 4475 on 7353  Progress: 4476 on 7353  Progress: 4477 on 7353  Progress: 4478 on 7353  Progress: 4479 on 7353  Progress: 4480 on 7353  Progress: 4481 on 7353  Progress: 4482 on 7353  Progress: 4483 on 7353  Progress: 4484 on 7353  Progress: 4485 on 7353  Progress: 4486 on 7353  Progress: 4487 on 7353  Progress: 4488 on 7353  Progress: 4489 on 7353  Progress: 4490 on 7353  Progress: 4491 on 7353  Progress: 4492 on 7353  Progress: 4493 on 7353  Progress: 4494 on 7353  Progress: 4495 on 7353  Progress: 4496 on 7353  Progress: 4497 on 7353  Progress: 4498 on 7353  Progress: 4499 on 7353  Progress: 4500 on 7353  Progress: 4501 on 7353  Progress: 4502 on 7353  Progress: 4503 on 7353  Progress: 4504 on 7353  Progress: 4505 on 7353  Progress: 4506 on 7353  Progress: 4507 on 7353  Progress: 4508 on 7353  Progress: 4509 on 7353  Progress: 4510 on 7353  Progress: 4511 on 7353  Progress: 4512 on 7353  Progress: 4513 on 7353  Progress: 4514 on 7353  Progress: 4515 on 7353  Progress: 4516 on 7353  Progress: 4517 on 7353  Progress: 4518 on 7353  Progress: 4519 on 7353  Progress: 4520 on 7353  Progress: 4521 on 7353  Progress: 4522 on 7353  Progress: 4523 on 7353  Progress: 4524 on 7353  Progress: 4525 on 7353  Progress: 4526 on 7353  Progress: 4527 on 7353  Progress: 4528 on 7353  Progress: 4529 on 7353  Progress: 4530 on 7353  Progress: 4531 on 7353  Progress: 4532 on 7353  Progress: 4533 on 7353  Progress: 4534 on 7353  Progress: 4535 on 7353  Progress: 4536 on 7353  Progress: 4537 on 7353  Progress: 4538 on 7353  Progress: 4539 on 7353  Progress: 4540 on 7353  Progress: 4541 on 7353  Progress: 4542 on 7353  Progress: 4543 on 7353  Progress: 4544 on 7353  Progress: 4545 on 7353  Progress: 4546 on 7353  Progress: 4547 on 7353  Progress: 4548 on 7353  Progress: 4549 on 7353  Progress: 4550 on 7353  Progress: 4551 on 7353  Progress: 4552 on 7353  Progress: 4553 on 7353  Progress: 4554 on 7353  Progress: 4555 on 7353  Progress: 4556 on 7353  Progress: 4557 on 7353  Progress: 4558 on 7353  Progress: 4559 on 7353  Progress: 4560 on 7353  Progress: 4561 on 7353  Progress: 4562 on 7353  Progress: 4563 on 7353  Progress: 4564 on 7353  Progress: 4565 on 7353  Progress: 4566 on 7353  Progress: 4567 on 7353  Progress: 4568 on 7353  Progress: 4569 on 7353  Progress: 4570 on 7353  Progress: 4571 on 7353  Progress: 4572 on 7353  Progress: 4573 on 7353  Progress: 4574 on 7353  Progress: 4575 on 7353  Progress: 4576 on 7353  Progress: 4577 on 7353  Progress: 4578 on 7353  Progress: 4579 on 7353  Progress: 4580 on 7353  Progress: 4581 on 7353  Progress: 4582 on 7353  Progress: 4583 on 7353  Progress: 4584 on 7353  Progress: 4585 on 7353  Progress: 4586 on 7353  Progress: 4587 on 7353  Progress: 4588 on 7353  Progress: 4589 on 7353  Progress: 4590 on 7353  Progress: 4591 on 7353  Progress: 4592 on 7353  Progress: 4593 on 7353  Progress: 4594 on 7353  Progress: 4595 on 7353  Progress: 4596 on 7353  Progress: 4597 on 7353  Progress: 4598 on 7353  Progress: 4599 on 7353  Progress: 4600 on 7353  Progress: 4601 on 7353  Progress: 4602 on 7353  Progress: 4603 on 7353  Progress: 4604 on 7353  Progress: 4605 on 7353  Progress: 4606 on 7353  Progress: 4607 on 7353  Progress: 4608 on 7353  Progress: 4609 on 7353  Progress: 4610 on 7353  Progress: 4611 on 7353  Progress: 4612 on 7353  Progress: 4613 on 7353  Progress: 4614 on 7353  Progress: 4615 on 7353  Progress: 4616 on 7353  Progress: 4617 on 7353  Progress: 4618 on 7353  Progress: 4619 on 7353  Progress: 4620 on 7353  Progress: 4621 on 7353  Progress: 4622 on 7353  Progress: 4623 on 7353  Progress: 4624 on 7353  Progress: 4625 on 7353  Progress: 4626 on 7353  Progress: 4627 on 7353  Progress: 4628 on 7353  Progress: 4629 on 7353  Progress: 4630 on 7353  Progress: 4631 on 7353  Progress: 4632 on 7353  Progress: 4633 on 7353  Progress: 4634 on 7353  Progress: 4635 on 7353  Progress: 4636 on 7353  Progress: 4637 on 7353  Progress: 4638 on 7353  Progress: 4639 on 7353  Progress: 4640 on 7353  Progress: 4641 on 7353  Progress: 4642 on 7353  Progress: 4643 on 7353  Progress: 4644 on 7353  Progress: 4645 on 7353  Progress: 4646 on 7353  Progress: 4647 on 7353  Progress: 4648 on 7353  Progress: 4649 on 7353  Progress: 4650 on 7353  Progress: 4651 on 7353  Progress: 4652 on 7353  Progress: 4653 on 7353  Progress: 4654 on 7353  Progress: 4655 on 7353  Progress: 4656 on 7353  Progress: 4657 on 7353  Progress: 4658 on 7353  Progress: 4659 on 7353  Progress: 4660 on 7353  Progress: 4661 on 7353  Progress: 4662 on 7353  Progress: 4663 on 7353  Progress: 4664 on 7353  Progress: 4665 on 7353  Progress: 4666 on 7353  Progress: 4667 on 7353  Progress: 4668 on 7353  Progress: 4669 on 7353  Progress: 4670 on 7353  Progress: 4671 on 7353  Progress: 4672 on 7353  Progress: 4673 on 7353  Progress: 4674 on 7353  Progress: 4675 on 7353  Progress: 4676 on 7353  Progress: 4677 on 7353  Progress: 4678 on 7353  Progress: 4679 on 7353  Progress: 4680 on 7353  Progress: 4681 on 7353  Progress: 4682 on 7353  Progress: 4683 on 7353  Progress: 4684 on 7353  Progress: 4685 on 7353  Progress: 4686 on 7353  Progress: 4687 on 7353  Progress: 4688 on 7353  Progress: 4689 on 7353  Progress: 4690 on 7353  Progress: 4691 on 7353  Progress: 4692 on 7353  Progress: 4693 on 7353  Progress: 4694 on 7353  Progress: 4695 on 7353  Progress: 4696 on 7353  Progress: 4697 on 7353  Progress: 4698 on 7353  Progress: 4699 on 7353  Progress: 4700 on 7353  Progress: 4701 on 7353  Progress: 4702 on 7353  Progress: 4703 on 7353  Progress: 4704 on 7353  Progress: 4705 on 7353  Progress: 4706 on 7353  Progress: 4707 on 7353  Progress: 4708 on 7353  Progress: 4709 on 7353  Progress: 4710 on 7353  Progress: 4711 on 7353  Progress: 4712 on 7353  Progress: 4713 on 7353  Progress: 4714 on 7353  Progress: 4715 on 7353  Progress: 4716 on 7353  Progress: 4717 on 7353  Progress: 4718 on 7353  Progress: 4719 on 7353  Progress: 4720 on 7353  Progress: 4721 on 7353  Progress: 4722 on 7353  Progress: 4723 on 7353  Progress: 4724 on 7353  Progress: 4725 on 7353  Progress: 4726 on 7353  Progress: 4727 on 7353  Progress: 4728 on 7353  Progress: 4729 on 7353  Progress: 4730 on 7353  Progress: 4731 on 7353  Progress: 4732 on 7353  Progress: 4733 on 7353  Progress: 4734 on 7353  Progress: 4735 on 7353  Progress: 4736 on 7353  Progress: 4737 on 7353  Progress: 4738 on 7353  Progress: 4739 on 7353  Progress: 4740 on 7353  Progress: 4741 on 7353  Progress: 4742 on 7353  Progress: 4743 on 7353  Progress: 4744 on 7353  Progress: 4745 on 7353  Progress: 4746 on 7353  Progress: 4747 on 7353  Progress: 4748 on 7353  Progress: 4749 on 7353  Progress: 4750 on 7353  Progress: 4751 on 7353  Progress: 4752 on 7353  Progress: 4753 on 7353  Progress: 4754 on 7353  Progress: 4755 on 7353  Progress: 4756 on 7353  Progress: 4757 on 7353  Progress: 4758 on 7353  Progress: 4759 on 7353  Progress: 4760 on 7353  Progress: 4761 on 7353  Progress: 4762 on 7353  Progress: 4763 on 7353  Progress: 4764 on 7353  Progress: 4765 on 7353  Progress: 4766 on 7353  Progress: 4767 on 7353  Progress: 4768 on 7353  Progress: 4769 on 7353  Progress: 4770 on 7353  Progress: 4771 on 7353  Progress: 4772 on 7353  Progress: 4773 on 7353  Progress: 4774 on 7353  Progress: 4775 on 7353  Progress: 4776 on 7353  Progress: 4777 on 7353  Progress: 4778 on 7353  Progress: 4779 on 7353  Progress: 4780 on 7353  Progress: 4781 on 7353  Progress: 4782 on 7353  Progress: 4783 on 7353  Progress: 4784 on 7353  Progress: 4785 on 7353  Progress: 4786 on 7353  Progress: 4787 on 7353  Progress: 4788 on 7353  Progress: 4789 on 7353  Progress: 4790 on 7353  Progress: 4791 on 7353  Progress: 4792 on 7353  Progress: 4793 on 7353  Progress: 4794 on 7353  Progress: 4795 on 7353  Progress: 4796 on 7353  Progress: 4797 on 7353  Progress: 4798 on 7353  Progress: 4799 on 7353  Progress: 4800 on 7353  Progress: 4801 on 7353  Progress: 4802 on 7353  Progress: 4803 on 7353  Progress: 4804 on 7353  Progress: 4805 on 7353  Progress: 4806 on 7353  Progress: 4807 on 7353  Progress: 4808 on 7353  Progress: 4809 on 7353  Progress: 4810 on 7353  Progress: 4811 on 7353  Progress: 4812 on 7353  Progress: 4813 on 7353  Progress: 4814 on 7353  Progress: 4815 on 7353  Progress: 4816 on 7353  Progress: 4817 on 7353  Progress: 4818 on 7353  Progress: 4819 on 7353  Progress: 4820 on 7353  Progress: 4821 on 7353  Progress: 4822 on 7353  Progress: 4823 on 7353  Progress: 4824 on 7353  Progress: 4825 on 7353  Progress: 4826 on 7353  Progress: 4827 on 7353  Progress: 4828 on 7353  Progress: 4829 on 7353  Progress: 4830 on 7353  Progress: 4831 on 7353  Progress: 4832 on 7353  Progress: 4833 on 7353  Progress: 4834 on 7353  Progress: 4835 on 7353  Progress: 4836 on 7353  Progress: 4837 on 7353  Progress: 4838 on 7353  Progress: 4839 on 7353  Progress: 4840 on 7353  Progress: 4841 on 7353  Progress: 4842 on 7353  Progress: 4843 on 7353  Progress: 4844 on 7353  Progress: 4845 on 7353  Progress: 4846 on 7353  Progress: 4847 on 7353  Progress: 4848 on 7353  Progress: 4849 on 7353  Progress: 4850 on 7353  Progress: 4851 on 7353  Progress: 4852 on 7353  Progress: 4853 on 7353  Progress: 4854 on 7353  Progress: 4855 on 7353  Progress: 4856 on 7353  Progress: 4857 on 7353  Progress: 4858 on 7353  Progress: 4859 on 7353  Progress: 4860 on 7353  Progress: 4861 on 7353  Progress: 4862 on 7353  Progress: 4863 on 7353  Progress: 4864 on 7353  Progress: 4865 on 7353  Progress: 4866 on 7353  Progress: 4867 on 7353  Progress: 4868 on 7353  Progress: 4869 on 7353  Progress: 4870 on 7353  Progress: 4871 on 7353  Progress: 4872 on 7353  Progress: 4873 on 7353  Progress: 4874 on 7353  Progress: 4875 on 7353  Progress: 4876 on 7353  Progress: 4877 on 7353  Progress: 4878 on 7353  Progress: 4879 on 7353  Progress: 4880 on 7353  Progress: 4881 on 7353  Progress: 4882 on 7353  Progress: 4883 on 7353  Progress: 4884 on 7353  Progress: 4885 on 7353  Progress: 4886 on 7353  Progress: 4887 on 7353  Progress: 4888 on 7353  Progress: 4889 on 7353  Progress: 4890 on 7353  Progress: 4891 on 7353  Progress: 4892 on 7353  Progress: 4893 on 7353  Progress: 4894 on 7353  Progress: 4895 on 7353  Progress: 4896 on 7353  Progress: 4897 on 7353  Progress: 4898 on 7353  Progress: 4899 on 7353  Progress: 4900 on 7353  Progress: 4901 on 7353  Progress: 4902 on 7353  Progress: 4903 on 7353  Progress: 4904 on 7353  Progress: 4905 on 7353  Progress: 4906 on 7353  Progress: 4907 on 7353  Progress: 4908 on 7353  Progress: 4909 on 7353  Progress: 4910 on 7353  Progress: 4911 on 7353  Progress: 4912 on 7353  Progress: 4913 on 7353  Progress: 4914 on 7353  Progress: 4915 on 7353  Progress: 4916 on 7353  Progress: 4917 on 7353  Progress: 4918 on 7353  Progress: 4919 on 7353  Progress: 4920 on 7353  Progress: 4921 on 7353  Progress: 4922 on 7353  Progress: 4923 on 7353  Progress: 4924 on 7353  Progress: 4925 on 7353  Progress: 4926 on 7353  Progress: 4927 on 7353  Progress: 4928 on 7353  Progress: 4929 on 7353  Progress: 4930 on 7353  Progress: 4931 on 7353  Progress: 4932 on 7353  Progress: 4933 on 7353  Progress: 4934 on 7353  Progress: 4935 on 7353  Progress: 4936 on 7353  Progress: 4937 on 7353  Progress: 4938 on 7353  Progress: 4939 on 7353  Progress: 4940 on 7353  Progress: 4941 on 7353  Progress: 4942 on 7353  Progress: 4943 on 7353  Progress: 4944 on 7353  Progress: 4945 on 7353  Progress: 4946 on 7353  Progress: 4947 on 7353  Progress: 4948 on 7353  Progress: 4949 on 7353  Progress: 4950 on 7353  Progress: 4951 on 7353  Progress: 4952 on 7353  Progress: 4953 on 7353  Progress: 4954 on 7353  Progress: 4955 on 7353  Progress: 4956 on 7353  Progress: 4957 on 7353  Progress: 4958 on 7353  Progress: 4959 on 7353  Progress: 4960 on 7353  Progress: 4961 on 7353  Progress: 4962 on 7353  Progress: 4963 on 7353  Progress: 4964 on 7353  Progress: 4965 on 7353  Progress: 4966 on 7353  Progress: 4967 on 7353  Progress: 4968 on 7353  Progress: 4969 on 7353  Progress: 4970 on 7353  Progress: 4971 on 7353  Progress: 4972 on 7353  Progress: 4973 on 7353  Progress: 4974 on 7353  Progress: 4975 on 7353  Progress: 4976 on 7353  Progress: 4977 on 7353  Progress: 4978 on 7353  Progress: 4979 on 7353  Progress: 4980 on 7353  Progress: 4981 on 7353  Progress: 4982 on 7353  Progress: 4983 on 7353  Progress: 4984 on 7353  Progress: 4985 on 7353  Progress: 4986 on 7353  Progress: 4987 on 7353  Progress: 4988 on 7353  Progress: 4989 on 7353  Progress: 4990 on 7353  Progress: 4991 on 7353  Progress: 4992 on 7353  Progress: 4993 on 7353  Progress: 4994 on 7353  Progress: 4995 on 7353  Progress: 4996 on 7353  Progress: 4997 on 7353  Progress: 4998 on 7353  Progress: 4999 on 7353  Progress: 5000 on 7353  Progress: 5001 on 7353  Progress: 5002 on 7353  Progress: 5003 on 7353  Progress: 5004 on 7353  Progress: 5005 on 7353  Progress: 5006 on 7353  Progress: 5007 on 7353  Progress: 5008 on 7353  Progress: 5009 on 7353  Progress: 5010 on 7353  Progress: 5011 on 7353  Progress: 5012 on 7353  Progress: 5013 on 7353  Progress: 5014 on 7353  Progress: 5015 on 7353  Progress: 5016 on 7353  Progress: 5017 on 7353  Progress: 5018 on 7353  Progress: 5019 on 7353  Progress: 5020 on 7353  Progress: 5021 on 7353  Progress: 5022 on 7353  Progress: 5023 on 7353  Progress: 5024 on 7353  Progress: 5025 on 7353  Progress: 5026 on 7353  Progress: 5027 on 7353  Progress: 5028 on 7353  Progress: 5029 on 7353  Progress: 5030 on 7353  Progress: 5031 on 7353  Progress: 5032 on 7353  Progress: 5033 on 7353  Progress: 5034 on 7353  Progress: 5035 on 7353  Progress: 5036 on 7353  Progress: 5037 on 7353  Progress: 5038 on 7353  Progress: 5039 on 7353  Progress: 5040 on 7353  Progress: 5041 on 7353  Progress: 5042 on 7353  Progress: 5043 on 7353  Progress: 5044 on 7353  Progress: 5045 on 7353  Progress: 5046 on 7353  Progress: 5047 on 7353  Progress: 5048 on 7353  Progress: 5049 on 7353  Progress: 5050 on 7353  Progress: 5051 on 7353  Progress: 5052 on 7353  Progress: 5053 on 7353  Progress: 5054 on 7353  Progress: 5055 on 7353  Progress: 5056 on 7353  Progress: 5057 on 7353  Progress: 5058 on 7353  Progress: 5059 on 7353  Progress: 5060 on 7353  Progress: 5061 on 7353  Progress: 5062 on 7353  Progress: 5063 on 7353  Progress: 5064 on 7353  Progress: 5065 on 7353  Progress: 5066 on 7353  Progress: 5067 on 7353  Progress: 5068 on 7353  Progress: 5069 on 7353  Progress: 5070 on 7353  Progress: 5071 on 7353  Progress: 5072 on 7353  Progress: 5073 on 7353  Progress: 5074 on 7353  Progress: 5075 on 7353  Progress: 5076 on 7353  Progress: 5077 on 7353  Progress: 5078 on 7353  Progress: 5079 on 7353  Progress: 5080 on 7353  Progress: 5081 on 7353  Progress: 5082 on 7353  Progress: 5083 on 7353  Progress: 5084 on 7353  Progress: 5085 on 7353  Progress: 5086 on 7353  Progress: 5087 on 7353  Progress: 5088 on 7353  Progress: 5089 on 7353  Progress: 5090 on 7353  Progress: 5091 on 7353  Progress: 5092 on 7353  Progress: 5093 on 7353  Progress: 5094 on 7353  Progress: 5095 on 7353  Progress: 5096 on 7353  Progress: 5097 on 7353  Progress: 5098 on 7353  Progress: 5099 on 7353  Progress: 5100 on 7353  Progress: 5101 on 7353  Progress: 5102 on 7353  Progress: 5103 on 7353  Progress: 5104 on 7353  Progress: 5105 on 7353  Progress: 5106 on 7353  Progress: 5107 on 7353  Progress: 5108 on 7353  Progress: 5109 on 7353  Progress: 5110 on 7353  Progress: 5111 on 7353  Progress: 5112 on 7353  Progress: 5113 on 7353  Progress: 5114 on 7353  Progress: 5115 on 7353  Progress: 5116 on 7353  Progress: 5117 on 7353  Progress: 5118 on 7353  Progress: 5119 on 7353  Progress: 5120 on 7353  Progress: 5121 on 7353  Progress: 5122 on 7353  Progress: 5123 on 7353  Progress: 5124 on 7353  Progress: 5125 on 7353  Progress: 5126 on 7353  Progress: 5127 on 7353  Progress: 5128 on 7353  Progress: 5129 on 7353  Progress: 5130 on 7353  Progress: 5131 on 7353  Progress: 5132 on 7353  Progress: 5133 on 7353  Progress: 5134 on 7353  Progress: 5135 on 7353  Progress: 5136 on 7353  Progress: 5137 on 7353  Progress: 5138 on 7353  Progress: 5139 on 7353  Progress: 5140 on 7353  Progress: 5141 on 7353  Progress: 5142 on 7353  Progress: 5143 on 7353  Progress: 5144 on 7353  Progress: 5145 on 7353  Progress: 5146 on 7353  Progress: 5147 on 7353  Progress: 5148 on 7353  Progress: 5149 on 7353  Progress: 5150 on 7353  Progress: 5151 on 7353  Progress: 5152 on 7353  Progress: 5153 on 7353  Progress: 5154 on 7353  Progress: 5155 on 7353  Progress: 5156 on 7353  Progress: 5157 on 7353  Progress: 5158 on 7353  Progress: 5159 on 7353  Progress: 5160 on 7353  Progress: 5161 on 7353  Progress: 5162 on 7353  Progress: 5163 on 7353  Progress: 5164 on 7353  Progress: 5165 on 7353  Progress: 5166 on 7353  Progress: 5167 on 7353  Progress: 5168 on 7353  Progress: 5169 on 7353  Progress: 5170 on 7353  Progress: 5171 on 7353  Progress: 5172 on 7353  Progress: 5173 on 7353  Progress: 5174 on 7353  Progress: 5175 on 7353  Progress: 5176 on 7353  Progress: 5177 on 7353  Progress: 5178 on 7353  Progress: 5179 on 7353  Progress: 5180 on 7353  Progress: 5181 on 7353  Progress: 5182 on 7353  Progress: 5183 on 7353  Progress: 5184 on 7353  Progress: 5185 on 7353  Progress: 5186 on 7353  Progress: 5187 on 7353  Progress: 5188 on 7353  Progress: 5189 on 7353  Progress: 5190 on 7353  Progress: 5191 on 7353  Progress: 5192 on 7353  Progress: 5193 on 7353  Progress: 5194 on 7353  Progress: 5195 on 7353  Progress: 5196 on 7353  Progress: 5197 on 7353  Progress: 5198 on 7353  Progress: 5199 on 7353  Progress: 5200 on 7353  Progress: 5201 on 7353  Progress: 5202 on 7353  Progress: 5203 on 7353  Progress: 5204 on 7353  Progress: 5205 on 7353  Progress: 5206 on 7353  Progress: 5207 on 7353  Progress: 5208 on 7353  Progress: 5209 on 7353  Progress: 5210 on 7353  Progress: 5211 on 7353  Progress: 5212 on 7353  Progress: 5213 on 7353  Progress: 5214 on 7353  Progress: 5215 on 7353  Progress: 5216 on 7353  Progress: 5217 on 7353  Progress: 5218 on 7353  Progress: 5219 on 7353  Progress: 5220 on 7353  Progress: 5221 on 7353  Progress: 5222 on 7353  Progress: 5223 on 7353  Progress: 5224 on 7353  Progress: 5225 on 7353  Progress: 5226 on 7353  Progress: 5227 on 7353  Progress: 5228 on 7353  Progress: 5229 on 7353  Progress: 5230 on 7353  Progress: 5231 on 7353  Progress: 5232 on 7353  Progress: 5233 on 7353  Progress: 5234 on 7353  Progress: 5235 on 7353  Progress: 5236 on 7353  Progress: 5237 on 7353  Progress: 5238 on 7353  Progress: 5239 on 7353  Progress: 5240 on 7353  Progress: 5241 on 7353  Progress: 5242 on 7353  Progress: 5243 on 7353  Progress: 5244 on 7353  Progress: 5245 on 7353  Progress: 5246 on 7353  Progress: 5247 on 7353  Progress: 5248 on 7353  Progress: 5249 on 7353  Progress: 5250 on 7353  Progress: 5251 on 7353  Progress: 5252 on 7353  Progress: 5253 on 7353  Progress: 5254 on 7353  Progress: 5255 on 7353  Progress: 5256 on 7353  Progress: 5257 on 7353  Progress: 5258 on 7353  Progress: 5259 on 7353  Progress: 5260 on 7353  Progress: 5261 on 7353  Progress: 5262 on 7353  Progress: 5263 on 7353  Progress: 5264 on 7353  Progress: 5265 on 7353  Progress: 5266 on 7353  Progress: 5267 on 7353  Progress: 5268 on 7353  Progress: 5269 on 7353  Progress: 5270 on 7353  Progress: 5271 on 7353  Progress: 5272 on 7353  Progress: 5273 on 7353  Progress: 5274 on 7353  Progress: 5275 on 7353  Progress: 5276 on 7353  Progress: 5277 on 7353  Progress: 5278 on 7353  Progress: 5279 on 7353  Progress: 5280 on 7353  Progress: 5281 on 7353  Progress: 5282 on 7353  Progress: 5283 on 7353  Progress: 5284 on 7353  Progress: 5285 on 7353  Progress: 5286 on 7353  Progress: 5287 on 7353  Progress: 5288 on 7353  Progress: 5289 on 7353  Progress: 5290 on 7353  Progress: 5291 on 7353  Progress: 5292 on 7353  Progress: 5293 on 7353  Progress: 5294 on 7353  Progress: 5295 on 7353  Progress: 5296 on 7353  Progress: 5297 on 7353  Progress: 5298 on 7353  Progress: 5299 on 7353  Progress: 5300 on 7353  Progress: 5301 on 7353  Progress: 5302 on 7353  Progress: 5303 on 7353  Progress: 5304 on 7353  Progress: 5305 on 7353  Progress: 5306 on 7353  Progress: 5307 on 7353  Progress: 5308 on 7353  Progress: 5309 on 7353  Progress: 5310 on 7353  Progress: 5311 on 7353  Progress: 5312 on 7353  Progress: 5313 on 7353  Progress: 5314 on 7353  Progress: 5315 on 7353  Progress: 5316 on 7353  Progress: 5317 on 7353  Progress: 5318 on 7353  Progress: 5319 on 7353  Progress: 5320 on 7353  Progress: 5321 on 7353  Progress: 5322 on 7353  Progress: 5323 on 7353  Progress: 5324 on 7353  Progress: 5325 on 7353  Progress: 5326 on 7353  Progress: 5327 on 7353  Progress: 5328 on 7353  Progress: 5329 on 7353  Progress: 5330 on 7353  Progress: 5331 on 7353  Progress: 5332 on 7353  Progress: 5333 on 7353  Progress: 5334 on 7353  Progress: 5335 on 7353  Progress: 5336 on 7353  Progress: 5337 on 7353  Progress: 5338 on 7353  Progress: 5339 on 7353  Progress: 5340 on 7353  Progress: 5341 on 7353  Progress: 5342 on 7353  Progress: 5343 on 7353  Progress: 5344 on 7353  Progress: 5345 on 7353  Progress: 5346 on 7353  Progress: 5347 on 7353  Progress: 5348 on 7353  Progress: 5349 on 7353  Progress: 5350 on 7353  Progress: 5351 on 7353  Progress: 5352 on 7353  Progress: 5353 on 7353  Progress: 5354 on 7353  Progress: 5355 on 7353  Progress: 5356 on 7353  Progress: 5357 on 7353  Progress: 5358 on 7353  Progress: 5359 on 7353  Progress: 5360 on 7353  Progress: 5361 on 7353  Progress: 5362 on 7353  Progress: 5363 on 7353  Progress: 5364 on 7353  Progress: 5365 on 7353  Progress: 5366 on 7353  Progress: 5367 on 7353  Progress: 5368 on 7353  Progress: 5369 on 7353  Progress: 5370 on 7353  Progress: 5371 on 7353  Progress: 5372 on 7353  Progress: 5373 on 7353  Progress: 5374 on 7353  Progress: 5375 on 7353  Progress: 5376 on 7353  Progress: 5377 on 7353  Progress: 5378 on 7353  Progress: 5379 on 7353  Progress: 5380 on 7353  Progress: 5381 on 7353  Progress: 5382 on 7353  Progress: 5383 on 7353  Progress: 5384 on 7353  Progress: 5385 on 7353  Progress: 5386 on 7353  Progress: 5387 on 7353  Progress: 5388 on 7353  Progress: 5389 on 7353  Progress: 5390 on 7353  Progress: 5391 on 7353  Progress: 5392 on 7353  Progress: 5393 on 7353  Progress: 5394 on 7353  Progress: 5395 on 7353  Progress: 5396 on 7353  Progress: 5397 on 7353  Progress: 5398 on 7353  Progress: 5399 on 7353  Progress: 5400 on 7353  Progress: 5401 on 7353  Progress: 5402 on 7353  Progress: 5403 on 7353  Progress: 5404 on 7353  Progress: 5405 on 7353  Progress: 5406 on 7353  Progress: 5407 on 7353  Progress: 5408 on 7353  Progress: 5409 on 7353  Progress: 5410 on 7353  Progress: 5411 on 7353  Progress: 5412 on 7353  Progress: 5413 on 7353  Progress: 5414 on 7353  Progress: 5415 on 7353  Progress: 5416 on 7353  Progress: 5417 on 7353  Progress: 5418 on 7353  Progress: 5419 on 7353  Progress: 5420 on 7353  Progress: 5421 on 7353  Progress: 5422 on 7353  Progress: 5423 on 7353  Progress: 5424 on 7353  Progress: 5425 on 7353  Progress: 5426 on 7353  Progress: 5427 on 7353  Progress: 5428 on 7353  Progress: 5429 on 7353  Progress: 5430 on 7353  Progress: 5431 on 7353  Progress: 5432 on 7353  Progress: 5433 on 7353  Progress: 5434 on 7353  Progress: 5435 on 7353  Progress: 5436 on 7353  Progress: 5437 on 7353  Progress: 5438 on 7353  Progress: 5439 on 7353  Progress: 5440 on 7353  Progress: 5441 on 7353  Progress: 5442 on 7353  Progress: 5443 on 7353  Progress: 5444 on 7353  Progress: 5445 on 7353  Progress: 5446 on 7353  Progress: 5447 on 7353  Progress: 5448 on 7353  Progress: 5449 on 7353  Progress: 5450 on 7353  Progress: 5451 on 7353  Progress: 5452 on 7353  Progress: 5453 on 7353  Progress: 5454 on 7353  Progress: 5455 on 7353  Progress: 5456 on 7353  Progress: 5457 on 7353  Progress: 5458 on 7353  Progress: 5459 on 7353  Progress: 5460 on 7353  Progress: 5461 on 7353  Progress: 5462 on 7353  Progress: 5463 on 7353  Progress: 5464 on 7353  Progress: 5465 on 7353  Progress: 5466 on 7353  Progress: 5467 on 7353  Progress: 5468 on 7353  Progress: 5469 on 7353  Progress: 5470 on 7353  Progress: 5471 on 7353  Progress: 5472 on 7353  Progress: 5473 on 7353  Progress: 5474 on 7353  Progress: 5475 on 7353  Progress: 5476 on 7353  Progress: 5477 on 7353  Progress: 5478 on 7353  Progress: 5479 on 7353  Progress: 5480 on 7353  Progress: 5481 on 7353  Progress: 5482 on 7353  Progress: 5483 on 7353  Progress: 5484 on 7353  Progress: 5485 on 7353  Progress: 5486 on 7353  Progress: 5487 on 7353  Progress: 5488 on 7353  Progress: 5489 on 7353  Progress: 5490 on 7353  Progress: 5491 on 7353  Progress: 5492 on 7353  Progress: 5493 on 7353  Progress: 5494 on 7353  Progress: 5495 on 7353  Progress: 5496 on 7353  Progress: 5497 on 7353  Progress: 5498 on 7353  Progress: 5499 on 7353  Progress: 5500 on 7353  Progress: 5501 on 7353  Progress: 5502 on 7353  Progress: 5503 on 7353  Progress: 5504 on 7353  Progress: 5505 on 7353  Progress: 5506 on 7353  Progress: 5507 on 7353  Progress: 5508 on 7353  Progress: 5509 on 7353  Progress: 5510 on 7353  Progress: 5511 on 7353  Progress: 5512 on 7353  Progress: 5513 on 7353  Progress: 5514 on 7353  Progress: 5515 on 7353  Progress: 5516 on 7353  Progress: 5517 on 7353  Progress: 5518 on 7353  Progress: 5519 on 7353  Progress: 5520 on 7353  Progress: 5521 on 7353  Progress: 5522 on 7353  Progress: 5523 on 7353  Progress: 5524 on 7353  Progress: 5525 on 7353  Progress: 5526 on 7353  Progress: 5527 on 7353  Progress: 5528 on 7353  Progress: 5529 on 7353  Progress: 5530 on 7353  Progress: 5531 on 7353  Progress: 5532 on 7353  Progress: 5533 on 7353  Progress: 5534 on 7353  Progress: 5535 on 7353  Progress: 5536 on 7353  Progress: 5537 on 7353  Progress: 5538 on 7353  Progress: 5539 on 7353  Progress: 5540 on 7353  Progress: 5541 on 7353  Progress: 5542 on 7353  Progress: 5543 on 7353  Progress: 5544 on 7353  Progress: 5545 on 7353  Progress: 5546 on 7353  Progress: 5547 on 7353  Progress: 5548 on 7353  Progress: 5549 on 7353  Progress: 5550 on 7353  Progress: 5551 on 7353  Progress: 5552 on 7353  Progress: 5553 on 7353  Progress: 5554 on 7353  Progress: 5555 on 7353  Progress: 5556 on 7353  Progress: 5557 on 7353  Progress: 5558 on 7353  Progress: 5559 on 7353  Progress: 5560 on 7353  Progress: 5561 on 7353  Progress: 5562 on 7353  Progress: 5563 on 7353  Progress: 5564 on 7353  Progress: 5565 on 7353  Progress: 5566 on 7353  Progress: 5567 on 7353  Progress: 5568 on 7353  Progress: 5569 on 7353  Progress: 5570 on 7353  Progress: 5571 on 7353  Progress: 5572 on 7353  Progress: 5573 on 7353  Progress: 5574 on 7353  Progress: 5575 on 7353  Progress: 5576 on 7353  Progress: 5577 on 7353  Progress: 5578 on 7353  Progress: 5579 on 7353  Progress: 5580 on 7353  Progress: 5581 on 7353  Progress: 5582 on 7353  Progress: 5583 on 7353  Progress: 5584 on 7353  Progress: 5585 on 7353  Progress: 5586 on 7353  Progress: 5587 on 7353  Progress: 5588 on 7353  Progress: 5589 on 7353  Progress: 5590 on 7353  Progress: 5591 on 7353  Progress: 5592 on 7353  Progress: 5593 on 7353  Progress: 5594 on 7353  Progress: 5595 on 7353  Progress: 5596 on 7353  Progress: 5597 on 7353  Progress: 5598 on 7353  Progress: 5599 on 7353  Progress: 5600 on 7353  Progress: 5601 on 7353  Progress: 5602 on 7353  Progress: 5603 on 7353  Progress: 5604 on 7353  Progress: 5605 on 7353  Progress: 5606 on 7353  Progress: 5607 on 7353  Progress: 5608 on 7353  Progress: 5609 on 7353  Progress: 5610 on 7353  Progress: 5611 on 7353  Progress: 5612 on 7353  Progress: 5613 on 7353  Progress: 5614 on 7353  Progress: 5615 on 7353  Progress: 5616 on 7353  Progress: 5617 on 7353  Progress: 5618 on 7353  Progress: 5619 on 7353  Progress: 5620 on 7353  Progress: 5621 on 7353  Progress: 5622 on 7353  Progress: 5623 on 7353  Progress: 5624 on 7353  Progress: 5625 on 7353  Progress: 5626 on 7353  Progress: 5627 on 7353  Progress: 5628 on 7353  Progress: 5629 on 7353  Progress: 5630 on 7353  Progress: 5631 on 7353  Progress: 5632 on 7353  Progress: 5633 on 7353  Progress: 5634 on 7353  Progress: 5635 on 7353  Progress: 5636 on 7353  Progress: 5637 on 7353  Progress: 5638 on 7353  Progress: 5639 on 7353  Progress: 5640 on 7353  Progress: 5641 on 7353  Progress: 5642 on 7353  Progress: 5643 on 7353  Progress: 5644 on 7353  Progress: 5645 on 7353  Progress: 5646 on 7353  Progress: 5647 on 7353  Progress: 5648 on 7353  Progress: 5649 on 7353  Progress: 5650 on 7353  Progress: 5651 on 7353  Progress: 5652 on 7353  Progress: 5653 on 7353  Progress: 5654 on 7353  Progress: 5655 on 7353  Progress: 5656 on 7353  Progress: 5657 on 7353  Progress: 5658 on 7353  Progress: 5659 on 7353  Progress: 5660 on 7353  Progress: 5661 on 7353  Progress: 5662 on 7353  Progress: 5663 on 7353  Progress: 5664 on 7353  Progress: 5665 on 7353  Progress: 5666 on 7353  Progress: 5667 on 7353  Progress: 5668 on 7353  Progress: 5669 on 7353  Progress: 5670 on 7353  Progress: 5671 on 7353  Progress: 5672 on 7353  Progress: 5673 on 7353  Progress: 5674 on 7353  Progress: 5675 on 7353  Progress: 5676 on 7353  Progress: 5677 on 7353  Progress: 5678 on 7353  Progress: 5679 on 7353  Progress: 5680 on 7353  Progress: 5681 on 7353  Progress: 5682 on 7353  Progress: 5683 on 7353  Progress: 5684 on 7353  Progress: 5685 on 7353  Progress: 5686 on 7353  Progress: 5687 on 7353  Progress: 5688 on 7353  Progress: 5689 on 7353  Progress: 5690 on 7353  Progress: 5691 on 7353  Progress: 5692 on 7353  Progress: 5693 on 7353  Progress: 5694 on 7353  Progress: 5695 on 7353  Progress: 5696 on 7353  Progress: 5697 on 7353  Progress: 5698 on 7353  Progress: 5699 on 7353  Progress: 5700 on 7353  Progress: 5701 on 7353  Progress: 5702 on 7353  Progress: 5703 on 7353  Progress: 5704 on 7353  Progress: 5705 on 7353  Progress: 5706 on 7353  Progress: 5707 on 7353  Progress: 5708 on 7353  Progress: 5709 on 7353  Progress: 5710 on 7353  Progress: 5711 on 7353  Progress: 5712 on 7353  Progress: 5713 on 7353  Progress: 5714 on 7353  Progress: 5715 on 7353  Progress: 5716 on 7353  Progress: 5717 on 7353  Progress: 5718 on 7353  Progress: 5719 on 7353  Progress: 5720 on 7353  Progress: 5721 on 7353  Progress: 5722 on 7353  Progress: 5723 on 7353  Progress: 5724 on 7353  Progress: 5725 on 7353  Progress: 5726 on 7353  Progress: 5727 on 7353  Progress: 5728 on 7353  Progress: 5729 on 7353  Progress: 5730 on 7353  Progress: 5731 on 7353  Progress: 5732 on 7353  Progress: 5733 on 7353  Progress: 5734 on 7353  Progress: 5735 on 7353  Progress: 5736 on 7353  Progress: 5737 on 7353  Progress: 5738 on 7353  Progress: 5739 on 7353  Progress: 5740 on 7353  Progress: 5741 on 7353  Progress: 5742 on 7353  Progress: 5743 on 7353  Progress: 5744 on 7353  Progress: 5745 on 7353  Progress: 5746 on 7353  Progress: 5747 on 7353  Progress: 5748 on 7353  Progress: 5749 on 7353  Progress: 5750 on 7353  Progress: 5751 on 7353  Progress: 5752 on 7353  Progress: 5753 on 7353  Progress: 5754 on 7353  Progress: 5755 on 7353  Progress: 5756 on 7353  Progress: 5757 on 7353  Progress: 5758 on 7353  Progress: 5759 on 7353  Progress: 5760 on 7353  Progress: 5761 on 7353  Progress: 5762 on 7353  Progress: 5763 on 7353  Progress: 5764 on 7353  Progress: 5765 on 7353  Progress: 5766 on 7353  Progress: 5767 on 7353  Progress: 5768 on 7353  Progress: 5769 on 7353  Progress: 5770 on 7353  Progress: 5771 on 7353  Progress: 5772 on 7353  Progress: 5773 on 7353  Progress: 5774 on 7353  Progress: 5775 on 7353  Progress: 5776 on 7353  Progress: 5777 on 7353  Progress: 5778 on 7353  Progress: 5779 on 7353  Progress: 5780 on 7353  Progress: 5781 on 7353  Progress: 5782 on 7353  Progress: 5783 on 7353  Progress: 5784 on 7353  Progress: 5785 on 7353  Progress: 5786 on 7353  Progress: 5787 on 7353  Progress: 5788 on 7353  Progress: 5789 on 7353  Progress: 5790 on 7353  Progress: 5791 on 7353  Progress: 5792 on 7353  Progress: 5793 on 7353  Progress: 5794 on 7353  Progress: 5795 on 7353  Progress: 5796 on 7353  Progress: 5797 on 7353  Progress: 5798 on 7353  Progress: 5799 on 7353  Progress: 5800 on 7353  Progress: 5801 on 7353  Progress: 5802 on 7353  Progress: 5803 on 7353  Progress: 5804 on 7353  Progress: 5805 on 7353  Progress: 5806 on 7353  Progress: 5807 on 7353  Progress: 5808 on 7353  Progress: 5809 on 7353  Progress: 5810 on 7353  Progress: 5811 on 7353  Progress: 5812 on 7353  Progress: 5813 on 7353  Progress: 5814 on 7353  Progress: 5815 on 7353  Progress: 5816 on 7353  Progress: 5817 on 7353  Progress: 5818 on 7353  Progress: 5819 on 7353  Progress: 5820 on 7353  Progress: 5821 on 7353  Progress: 5822 on 7353  Progress: 5823 on 7353  Progress: 5824 on 7353  Progress: 5825 on 7353  Progress: 5826 on 7353  Progress: 5827 on 7353  Progress: 5828 on 7353  Progress: 5829 on 7353  Progress: 5830 on 7353  Progress: 5831 on 7353  Progress: 5832 on 7353  Progress: 5833 on 7353  Progress: 5834 on 7353  Progress: 5835 on 7353  Progress: 5836 on 7353  Progress: 5837 on 7353  Progress: 5838 on 7353  Progress: 5839 on 7353  Progress: 5840 on 7353  Progress: 5841 on 7353  Progress: 5842 on 7353  Progress: 5843 on 7353  Progress: 5844 on 7353  Progress: 5845 on 7353  Progress: 5846 on 7353  Progress: 5847 on 7353  Progress: 5848 on 7353  Progress: 5849 on 7353  Progress: 5850 on 7353  Progress: 5851 on 7353  Progress: 5852 on 7353  Progress: 5853 on 7353  Progress: 5854 on 7353  Progress: 5855 on 7353  Progress: 5856 on 7353  Progress: 5857 on 7353  Progress: 5858 on 7353  Progress: 5859 on 7353  Progress: 5860 on 7353  Progress: 5861 on 7353  Progress: 5862 on 7353  Progress: 5863 on 7353  Progress: 5864 on 7353  Progress: 5865 on 7353  Progress: 5866 on 7353  Progress: 5867 on 7353  Progress: 5868 on 7353  Progress: 5869 on 7353  Progress: 5870 on 7353  Progress: 5871 on 7353  Progress: 5872 on 7353  Progress: 5873 on 7353  Progress: 5874 on 7353  Progress: 5875 on 7353  Progress: 5876 on 7353  Progress: 5877 on 7353  Progress: 5878 on 7353  Progress: 5879 on 7353  Progress: 5880 on 7353  Progress: 5881 on 7353  Progress: 5882 on 7353  Progress: 5883 on 7353  Progress: 5884 on 7353  Progress: 5885 on 7353  Progress: 5886 on 7353  Progress: 5887 on 7353  Progress: 5888 on 7353  Progress: 5889 on 7353  Progress: 5890 on 7353  Progress: 5891 on 7353  Progress: 5892 on 7353  Progress: 5893 on 7353  Progress: 5894 on 7353  Progress: 5895 on 7353  Progress: 5896 on 7353  Progress: 5897 on 7353  Progress: 5898 on 7353  Progress: 5899 on 7353  Progress: 5900 on 7353  Progress: 5901 on 7353  Progress: 5902 on 7353  Progress: 5903 on 7353  Progress: 5904 on 7353  Progress: 5905 on 7353  Progress: 5906 on 7353  Progress: 5907 on 7353  Progress: 5908 on 7353  Progress: 5909 on 7353  Progress: 5910 on 7353  Progress: 5911 on 7353  Progress: 5912 on 7353  Progress: 5913 on 7353  Progress: 5914 on 7353  Progress: 5915 on 7353  Progress: 5916 on 7353  Progress: 5917 on 7353  Progress: 5918 on 7353  Progress: 5919 on 7353  Progress: 5920 on 7353  Progress: 5921 on 7353  Progress: 5922 on 7353  Progress: 5923 on 7353  Progress: 5924 on 7353  Progress: 5925 on 7353  Progress: 5926 on 7353  Progress: 5927 on 7353  Progress: 5928 on 7353  Progress: 5929 on 7353  Progress: 5930 on 7353  Progress: 5931 on 7353  Progress: 5932 on 7353  Progress: 5933 on 7353  Progress: 5934 on 7353  Progress: 5935 on 7353  Progress: 5936 on 7353  Progress: 5937 on 7353  Progress: 5938 on 7353  Progress: 5939 on 7353  Progress: 5940 on 7353  Progress: 5941 on 7353  Progress: 5942 on 7353  Progress: 5943 on 7353  Progress: 5944 on 7353  Progress: 5945 on 7353  Progress: 5946 on 7353  Progress: 5947 on 7353  Progress: 5948 on 7353  Progress: 5949 on 7353  Progress: 5950 on 7353  Progress: 5951 on 7353  Progress: 5952 on 7353  Progress: 5953 on 7353  Progress: 5954 on 7353  Progress: 5955 on 7353  Progress: 5956 on 7353  Progress: 5957 on 7353  Progress: 5958 on 7353  Progress: 5959 on 7353  Progress: 5960 on 7353  Progress: 5961 on 7353  Progress: 5962 on 7353  Progress: 5963 on 7353  Progress: 5964 on 7353  Progress: 5965 on 7353  Progress: 5966 on 7353  Progress: 5967 on 7353  Progress: 5968 on 7353  Progress: 5969 on 7353  Progress: 5970 on 7353  Progress: 5971 on 7353  Progress: 5972 on 7353  Progress: 5973 on 7353  Progress: 5974 on 7353  Progress: 5975 on 7353  Progress: 5976 on 7353  Progress: 5977 on 7353  Progress: 5978 on 7353  Progress: 5979 on 7353  Progress: 5980 on 7353  Progress: 5981 on 7353  Progress: 5982 on 7353  Progress: 5983 on 7353  Progress: 5984 on 7353  Progress: 5985 on 7353  Progress: 5986 on 7353  Progress: 5987 on 7353  Progress: 5988 on 7353  Progress: 5989 on 7353  Progress: 5990 on 7353  Progress: 5991 on 7353  Progress: 5992 on 7353  Progress: 5993 on 7353  Progress: 5994 on 7353  Progress: 5995 on 7353  Progress: 5996 on 7353  Progress: 5997 on 7353  Progress: 5998 on 7353  Progress: 5999 on 7353  Progress: 6000 on 7353  Progress: 6001 on 7353  Progress: 6002 on 7353  Progress: 6003 on 7353  Progress: 6004 on 7353  Progress: 6005 on 7353  Progress: 6006 on 7353  Progress: 6007 on 7353  Progress: 6008 on 7353  Progress: 6009 on 7353  Progress: 6010 on 7353  Progress: 6011 on 7353  Progress: 6012 on 7353  Progress: 6013 on 7353  Progress: 6014 on 7353  Progress: 6015 on 7353  Progress: 6016 on 7353  Progress: 6017 on 7353  Progress: 6018 on 7353  Progress: 6019 on 7353  Progress: 6020 on 7353  Progress: 6021 on 7353  Progress: 6022 on 7353  Progress: 6023 on 7353  Progress: 6024 on 7353  Progress: 6025 on 7353  Progress: 6026 on 7353  Progress: 6027 on 7353  Progress: 6028 on 7353  Progress: 6029 on 7353  Progress: 6030 on 7353  Progress: 6031 on 7353  Progress: 6032 on 7353  Progress: 6033 on 7353  Progress: 6034 on 7353  Progress: 6035 on 7353  Progress: 6036 on 7353  Progress: 6037 on 7353  Progress: 6038 on 7353  Progress: 6039 on 7353  Progress: 6040 on 7353  Progress: 6041 on 7353  Progress: 6042 on 7353  Progress: 6043 on 7353  Progress: 6044 on 7353  Progress: 6045 on 7353  Progress: 6046 on 7353  Progress: 6047 on 7353  Progress: 6048 on 7353  Progress: 6049 on 7353  Progress: 6050 on 7353  Progress: 6051 on 7353  Progress: 6052 on 7353  Progress: 6053 on 7353  Progress: 6054 on 7353  Progress: 6055 on 7353  Progress: 6056 on 7353  Progress: 6057 on 7353  Progress: 6058 on 7353  Progress: 6059 on 7353  Progress: 6060 on 7353  Progress: 6061 on 7353  Progress: 6062 on 7353  Progress: 6063 on 7353  Progress: 6064 on 7353  Progress: 6065 on 7353  Progress: 6066 on 7353  Progress: 6067 on 7353  Progress: 6068 on 7353  Progress: 6069 on 7353  Progress: 6070 on 7353  Progress: 6071 on 7353  Progress: 6072 on 7353  Progress: 6073 on 7353  Progress: 6074 on 7353  Progress: 6075 on 7353  Progress: 6076 on 7353  Progress: 6077 on 7353  Progress: 6078 on 7353  Progress: 6079 on 7353  Progress: 6080 on 7353  Progress: 6081 on 7353  Progress: 6082 on 7353  Progress: 6083 on 7353  Progress: 6084 on 7353  Progress: 6085 on 7353  Progress: 6086 on 7353  Progress: 6087 on 7353  Progress: 6088 on 7353  Progress: 6089 on 7353  Progress: 6090 on 7353  Progress: 6091 on 7353  Progress: 6092 on 7353  Progress: 6093 on 7353  Progress: 6094 on 7353  Progress: 6095 on 7353  Progress: 6096 on 7353  Progress: 6097 on 7353  Progress: 6098 on 7353  Progress: 6099 on 7353  Progress: 6100 on 7353  Progress: 6101 on 7353  Progress: 6102 on 7353  Progress: 6103 on 7353  Progress: 6104 on 7353  Progress: 6105 on 7353  Progress: 6106 on 7353  Progress: 6107 on 7353  Progress: 6108 on 7353  Progress: 6109 on 7353  Progress: 6110 on 7353  Progress: 6111 on 7353  Progress: 6112 on 7353  Progress: 6113 on 7353  Progress: 6114 on 7353  Progress: 6115 on 7353  Progress: 6116 on 7353  Progress: 6117 on 7353  Progress: 6118 on 7353  Progress: 6119 on 7353  Progress: 6120 on 7353  Progress: 6121 on 7353  Progress: 6122 on 7353  Progress: 6123 on 7353  Progress: 6124 on 7353  Progress: 6125 on 7353  Progress: 6126 on 7353  Progress: 6127 on 7353  Progress: 6128 on 7353  Progress: 6129 on 7353  Progress: 6130 on 7353  Progress: 6131 on 7353  Progress: 6132 on 7353  Progress: 6133 on 7353  Progress: 6134 on 7353  Progress: 6135 on 7353  Progress: 6136 on 7353  Progress: 6137 on 7353  Progress: 6138 on 7353  Progress: 6139 on 7353  Progress: 6140 on 7353  Progress: 6141 on 7353  Progress: 6142 on 7353  Progress: 6143 on 7353  Progress: 6144 on 7353  Progress: 6145 on 7353  Progress: 6146 on 7353  Progress: 6147 on 7353  Progress: 6148 on 7353  Progress: 6149 on 7353  Progress: 6150 on 7353  Progress: 6151 on 7353  Progress: 6152 on 7353  Progress: 6153 on 7353  Progress: 6154 on 7353  Progress: 6155 on 7353  Progress: 6156 on 7353  Progress: 6157 on 7353  Progress: 6158 on 7353  Progress: 6159 on 7353  Progress: 6160 on 7353  Progress: 6161 on 7353  Progress: 6162 on 7353  Progress: 6163 on 7353  Progress: 6164 on 7353  Progress: 6165 on 7353  Progress: 6166 on 7353  Progress: 6167 on 7353  Progress: 6168 on 7353  Progress: 6169 on 7353  Progress: 6170 on 7353  Progress: 6171 on 7353  Progress: 6172 on 7353  Progress: 6173 on 7353  Progress: 6174 on 7353  Progress: 6175 on 7353  Progress: 6176 on 7353  Progress: 6177 on 7353  Progress: 6178 on 7353  Progress: 6179 on 7353  Progress: 6180 on 7353  Progress: 6181 on 7353  Progress: 6182 on 7353  Progress: 6183 on 7353  Progress: 6184 on 7353  Progress: 6185 on 7353  Progress: 6186 on 7353  Progress: 6187 on 7353  Progress: 6188 on 7353  Progress: 6189 on 7353  Progress: 6190 on 7353  Progress: 6191 on 7353  Progress: 6192 on 7353  Progress: 6193 on 7353  Progress: 6194 on 7353  Progress: 6195 on 7353  Progress: 6196 on 7353  Progress: 6197 on 7353  Progress: 6198 on 7353  Progress: 6199 on 7353  Progress: 6200 on 7353  Progress: 6201 on 7353  Progress: 6202 on 7353  Progress: 6203 on 7353  Progress: 6204 on 7353  Progress: 6205 on 7353  Progress: 6206 on 7353  Progress: 6207 on 7353  Progress: 6208 on 7353  Progress: 6209 on 7353  Progress: 6210 on 7353  Progress: 6211 on 7353  Progress: 6212 on 7353  Progress: 6213 on 7353  Progress: 6214 on 7353  Progress: 6215 on 7353  Progress: 6216 on 7353  Progress: 6217 on 7353  Progress: 6218 on 7353  Progress: 6219 on 7353  Progress: 6220 on 7353  Progress: 6221 on 7353  Progress: 6222 on 7353  Progress: 6223 on 7353  Progress: 6224 on 7353  Progress: 6225 on 7353  Progress: 6226 on 7353  Progress: 6227 on 7353  Progress: 6228 on 7353  Progress: 6229 on 7353  Progress: 6230 on 7353  Progress: 6231 on 7353  Progress: 6232 on 7353  Progress: 6233 on 7353  Progress: 6234 on 7353  Progress: 6235 on 7353  Progress: 6236 on 7353  Progress: 6237 on 7353  Progress: 6238 on 7353  Progress: 6239 on 7353  Progress: 6240 on 7353  Progress: 6241 on 7353  Progress: 6242 on 7353  Progress: 6243 on 7353  Progress: 6244 on 7353  Progress: 6245 on 7353  Progress: 6246 on 7353  Progress: 6247 on 7353  Progress: 6248 on 7353  Progress: 6249 on 7353  Progress: 6250 on 7353  Progress: 6251 on 7353  Progress: 6252 on 7353  Progress: 6253 on 7353  Progress: 6254 on 7353  Progress: 6255 on 7353  Progress: 6256 on 7353  Progress: 6257 on 7353  Progress: 6258 on 7353  Progress: 6259 on 7353  Progress: 6260 on 7353  Progress: 6261 on 7353  Progress: 6262 on 7353  Progress: 6263 on 7353  Progress: 6264 on 7353  Progress: 6265 on 7353  Progress: 6266 on 7353  Progress: 6267 on 7353  Progress: 6268 on 7353  Progress: 6269 on 7353  Progress: 6270 on 7353  Progress: 6271 on 7353  Progress: 6272 on 7353  Progress: 6273 on 7353  Progress: 6274 on 7353  Progress: 6275 on 7353  Progress: 6276 on 7353  Progress: 6277 on 7353  Progress: 6278 on 7353  Progress: 6279 on 7353  Progress: 6280 on 7353  Progress: 6281 on 7353  Progress: 6282 on 7353  Progress: 6283 on 7353  Progress: 6284 on 7353  Progress: 6285 on 7353  Progress: 6286 on 7353  Progress: 6287 on 7353  Progress: 6288 on 7353  Progress: 6289 on 7353  Progress: 6290 on 7353  Progress: 6291 on 7353  Progress: 6292 on 7353  Progress: 6293 on 7353  Progress: 6294 on 7353  Progress: 6295 on 7353  Progress: 6296 on 7353  Progress: 6297 on 7353  Progress: 6298 on 7353  Progress: 6299 on 7353  Progress: 6300 on 7353  Progress: 6301 on 7353  Progress: 6302 on 7353  Progress: 6303 on 7353  Progress: 6304 on 7353  Progress: 6305 on 7353  Progress: 6306 on 7353  Progress: 6307 on 7353  Progress: 6308 on 7353  Progress: 6309 on 7353  Progress: 6310 on 7353  Progress: 6311 on 7353  Progress: 6312 on 7353  Progress: 6313 on 7353  Progress: 6314 on 7353  Progress: 6315 on 7353  Progress: 6316 on 7353  Progress: 6317 on 7353  Progress: 6318 on 7353  Progress: 6319 on 7353  Progress: 6320 on 7353  Progress: 6321 on 7353  Progress: 6322 on 7353  Progress: 6323 on 7353  Progress: 6324 on 7353  Progress: 6325 on 7353  Progress: 6326 on 7353  Progress: 6327 on 7353  Progress: 6328 on 7353  Progress: 6329 on 7353  Progress: 6330 on 7353  Progress: 6331 on 7353  Progress: 6332 on 7353  Progress: 6333 on 7353  Progress: 6334 on 7353  Progress: 6335 on 7353  Progress: 6336 on 7353  Progress: 6337 on 7353  Progress: 6338 on 7353  Progress: 6339 on 7353  Progress: 6340 on 7353  Progress: 6341 on 7353  Progress: 6342 on 7353  Progress: 6343 on 7353  Progress: 6344 on 7353  Progress: 6345 on 7353  Progress: 6346 on 7353  Progress: 6347 on 7353  Progress: 6348 on 7353  Progress: 6349 on 7353  Progress: 6350 on 7353  Progress: 6351 on 7353  Progress: 6352 on 7353  Progress: 6353 on 7353  Progress: 6354 on 7353  Progress: 6355 on 7353  Progress: 6356 on 7353  Progress: 6357 on 7353  Progress: 6358 on 7353  Progress: 6359 on 7353  Progress: 6360 on 7353  Progress: 6361 on 7353  Progress: 6362 on 7353  Progress: 6363 on 7353  Progress: 6364 on 7353  Progress: 6365 on 7353  Progress: 6366 on 7353  Progress: 6367 on 7353  Progress: 6368 on 7353  Progress: 6369 on 7353  Progress: 6370 on 7353  Progress: 6371 on 7353  Progress: 6372 on 7353  Progress: 6373 on 7353  Progress: 6374 on 7353  Progress: 6375 on 7353  Progress: 6376 on 7353  Progress: 6377 on 7353  Progress: 6378 on 7353  Progress: 6379 on 7353  Progress: 6380 on 7353  Progress: 6381 on 7353  Progress: 6382 on 7353  Progress: 6383 on 7353  Progress: 6384 on 7353  Progress: 6385 on 7353  Progress: 6386 on 7353  Progress: 6387 on 7353  Progress: 6388 on 7353  Progress: 6389 on 7353  Progress: 6390 on 7353  Progress: 6391 on 7353  Progress: 6392 on 7353  Progress: 6393 on 7353  Progress: 6394 on 7353  Progress: 6395 on 7353  Progress: 6396 on 7353  Progress: 6397 on 7353  Progress: 6398 on 7353  Progress: 6399 on 7353  Progress: 6400 on 7353  Progress: 6401 on 7353  Progress: 6402 on 7353  Progress: 6403 on 7353  Progress: 6404 on 7353  Progress: 6405 on 7353  Progress: 6406 on 7353  Progress: 6407 on 7353  Progress: 6408 on 7353  Progress: 6409 on 7353  Progress: 6410 on 7353  Progress: 6411 on 7353  Progress: 6412 on 7353  Progress: 6413 on 7353  Progress: 6414 on 7353  Progress: 6415 on 7353  Progress: 6416 on 7353  Progress: 6417 on 7353  Progress: 6418 on 7353  Progress: 6419 on 7353  Progress: 6420 on 7353  Progress: 6421 on 7353  Progress: 6422 on 7353  Progress: 6423 on 7353  Progress: 6424 on 7353  Progress: 6425 on 7353  Progress: 6426 on 7353  Progress: 6427 on 7353  Progress: 6428 on 7353  Progress: 6429 on 7353  Progress: 6430 on 7353  Progress: 6431 on 7353  Progress: 6432 on 7353  Progress: 6433 on 7353  Progress: 6434 on 7353  Progress: 6435 on 7353  Progress: 6436 on 7353  Progress: 6437 on 7353  Progress: 6438 on 7353  Progress: 6439 on 7353  Progress: 6440 on 7353  Progress: 6441 on 7353  Progress: 6442 on 7353  Progress: 6443 on 7353  Progress: 6444 on 7353  Progress: 6445 on 7353  Progress: 6446 on 7353  Progress: 6447 on 7353  Progress: 6448 on 7353  Progress: 6449 on 7353  Progress: 6450 on 7353  Progress: 6451 on 7353  Progress: 6452 on 7353  Progress: 6453 on 7353  Progress: 6454 on 7353  Progress: 6455 on 7353  Progress: 6456 on 7353  Progress: 6457 on 7353  Progress: 6458 on 7353  Progress: 6459 on 7353  Progress: 6460 on 7353  Progress: 6461 on 7353  Progress: 6462 on 7353  Progress: 6463 on 7353  Progress: 6464 on 7353  Progress: 6465 on 7353  Progress: 6466 on 7353  Progress: 6467 on 7353  Progress: 6468 on 7353  Progress: 6469 on 7353  Progress: 6470 on 7353  Progress: 6471 on 7353  Progress: 6472 on 7353  Progress: 6473 on 7353  Progress: 6474 on 7353  Progress: 6475 on 7353  Progress: 6476 on 7353  Progress: 6477 on 7353  Progress: 6478 on 7353  Progress: 6479 on 7353  Progress: 6480 on 7353  Progress: 6481 on 7353  Progress: 6482 on 7353  Progress: 6483 on 7353  Progress: 6484 on 7353  Progress: 6485 on 7353  Progress: 6486 on 7353  Progress: 6487 on 7353  Progress: 6488 on 7353  Progress: 6489 on 7353  Progress: 6490 on 7353  Progress: 6491 on 7353  Progress: 6492 on 7353  Progress: 6493 on 7353  Progress: 6494 on 7353  Progress: 6495 on 7353  Progress: 6496 on 7353  Progress: 6497 on 7353  Progress: 6498 on 7353  Progress: 6499 on 7353  Progress: 6500 on 7353  Progress: 6501 on 7353  Progress: 6502 on 7353  Progress: 6503 on 7353  Progress: 6504 on 7353  Progress: 6505 on 7353  Progress: 6506 on 7353  Progress: 6507 on 7353  Progress: 6508 on 7353  Progress: 6509 on 7353  Progress: 6510 on 7353  Progress: 6511 on 7353  Progress: 6512 on 7353  Progress: 6513 on 7353  Progress: 6514 on 7353  Progress: 6515 on 7353  Progress: 6516 on 7353  Progress: 6517 on 7353  Progress: 6518 on 7353  Progress: 6519 on 7353  Progress: 6520 on 7353  Progress: 6521 on 7353  Progress: 6522 on 7353  Progress: 6523 on 7353  Progress: 6524 on 7353  Progress: 6525 on 7353  Progress: 6526 on 7353  Progress: 6527 on 7353  Progress: 6528 on 7353  Progress: 6529 on 7353  Progress: 6530 on 7353  Progress: 6531 on 7353  Progress: 6532 on 7353  Progress: 6533 on 7353  Progress: 6534 on 7353  Progress: 6535 on 7353  Progress: 6536 on 7353  Progress: 6537 on 7353  Progress: 6538 on 7353  Progress: 6539 on 7353  Progress: 6540 on 7353  Progress: 6541 on 7353  Progress: 6542 on 7353  Progress: 6543 on 7353  Progress: 6544 on 7353  Progress: 6545 on 7353  Progress: 6546 on 7353  Progress: 6547 on 7353  Progress: 6548 on 7353  Progress: 6549 on 7353  Progress: 6550 on 7353  Progress: 6551 on 7353  Progress: 6552 on 7353  Progress: 6553 on 7353  Progress: 6554 on 7353  Progress: 6555 on 7353  Progress: 6556 on 7353  Progress: 6557 on 7353  Progress: 6558 on 7353  Progress: 6559 on 7353  Progress: 6560 on 7353  Progress: 6561 on 7353  Progress: 6562 on 7353  Progress: 6563 on 7353  Progress: 6564 on 7353  Progress: 6565 on 7353  Progress: 6566 on 7353  Progress: 6567 on 7353  Progress: 6568 on 7353  Progress: 6569 on 7353  Progress: 6570 on 7353  Progress: 6571 on 7353  Progress: 6572 on 7353  Progress: 6573 on 7353  Progress: 6574 on 7353  Progress: 6575 on 7353  Progress: 6576 on 7353  Progress: 6577 on 7353  Progress: 6578 on 7353  Progress: 6579 on 7353  Progress: 6580 on 7353  Progress: 6581 on 7353  Progress: 6582 on 7353  Progress: 6583 on 7353  Progress: 6584 on 7353  Progress: 6585 on 7353  Progress: 6586 on 7353  Progress: 6587 on 7353  Progress: 6588 on 7353  Progress: 6589 on 7353  Progress: 6590 on 7353  Progress: 6591 on 7353  Progress: 6592 on 7353  Progress: 6593 on 7353  Progress: 6594 on 7353  Progress: 6595 on 7353  Progress: 6596 on 7353  Progress: 6597 on 7353  Progress: 6598 on 7353  Progress: 6599 on 7353  Progress: 6600 on 7353  Progress: 6601 on 7353  Progress: 6602 on 7353  Progress: 6603 on 7353  Progress: 6604 on 7353  Progress: 6605 on 7353  Progress: 6606 on 7353  Progress: 6607 on 7353  Progress: 6608 on 7353  Progress: 6609 on 7353  Progress: 6610 on 7353  Progress: 6611 on 7353  Progress: 6612 on 7353  Progress: 6613 on 7353  Progress: 6614 on 7353  Progress: 6615 on 7353  Progress: 6616 on 7353  Progress: 6617 on 7353  Progress: 6618 on 7353  Progress: 6619 on 7353  Progress: 6620 on 7353  Progress: 6621 on 7353  Progress: 6622 on 7353  Progress: 6623 on 7353  Progress: 6624 on 7353  Progress: 6625 on 7353  Progress: 6626 on 7353  Progress: 6627 on 7353  Progress: 6628 on 7353  Progress: 6629 on 7353  Progress: 6630 on 7353  Progress: 6631 on 7353  Progress: 6632 on 7353  Progress: 6633 on 7353  Progress: 6634 on 7353  Progress: 6635 on 7353  Progress: 6636 on 7353  Progress: 6637 on 7353  Progress: 6638 on 7353  Progress: 6639 on 7353  Progress: 6640 on 7353  Progress: 6641 on 7353  Progress: 6642 on 7353  Progress: 6643 on 7353  Progress: 6644 on 7353  Progress: 6645 on 7353  Progress: 6646 on 7353  Progress: 6647 on 7353  Progress: 6648 on 7353  Progress: 6649 on 7353  Progress: 6650 on 7353  Progress: 6651 on 7353  Progress: 6652 on 7353  Progress: 6653 on 7353  Progress: 6654 on 7353  Progress: 6655 on 7353  Progress: 6656 on 7353  Progress: 6657 on 7353  Progress: 6658 on 7353  Progress: 6659 on 7353  Progress: 6660 on 7353  Progress: 6661 on 7353  Progress: 6662 on 7353  Progress: 6663 on 7353  Progress: 6664 on 7353  Progress: 6665 on 7353  Progress: 6666 on 7353  Progress: 6667 on 7353  Progress: 6668 on 7353  Progress: 6669 on 7353  Progress: 6670 on 7353  Progress: 6671 on 7353  Progress: 6672 on 7353  Progress: 6673 on 7353  Progress: 6674 on 7353  Progress: 6675 on 7353  Progress: 6676 on 7353  Progress: 6677 on 7353  Progress: 6678 on 7353  Progress: 6679 on 7353  Progress: 6680 on 7353  Progress: 6681 on 7353  Progress: 6682 on 7353  Progress: 6683 on 7353  Progress: 6684 on 7353  Progress: 6685 on 7353  Progress: 6686 on 7353  Progress: 6687 on 7353  Progress: 6688 on 7353  Progress: 6689 on 7353  Progress: 6690 on 7353  Progress: 6691 on 7353  Progress: 6692 on 7353  Progress: 6693 on 7353  Progress: 6694 on 7353  Progress: 6695 on 7353  Progress: 6696 on 7353  Progress: 6697 on 7353  Progress: 6698 on 7353  Progress: 6699 on 7353  Progress: 6700 on 7353  Progress: 6701 on 7353  Progress: 6702 on 7353  Progress: 6703 on 7353  Progress: 6704 on 7353  Progress: 6705 on 7353  Progress: 6706 on 7353  Progress: 6707 on 7353  Progress: 6708 on 7353  Progress: 6709 on 7353  Progress: 6710 on 7353  Progress: 6711 on 7353  Progress: 6712 on 7353  Progress: 6713 on 7353  Progress: 6714 on 7353  Progress: 6715 on 7353  Progress: 6716 on 7353  Progress: 6717 on 7353  Progress: 6718 on 7353  Progress: 6719 on 7353  Progress: 6720 on 7353  Progress: 6721 on 7353  Progress: 6722 on 7353  Progress: 6723 on 7353  Progress: 6724 on 7353  Progress: 6725 on 7353  Progress: 6726 on 7353  Progress: 6727 on 7353  Progress: 6728 on 7353  Progress: 6729 on 7353  Progress: 6730 on 7353  Progress: 6731 on 7353  Progress: 6732 on 7353  Progress: 6733 on 7353  Progress: 6734 on 7353  Progress: 6735 on 7353  Progress: 6736 on 7353  Progress: 6737 on 7353  Progress: 6738 on 7353  Progress: 6739 on 7353  Progress: 6740 on 7353  Progress: 6741 on 7353  Progress: 6742 on 7353  Progress: 6743 on 7353  Progress: 6744 on 7353  Progress: 6745 on 7353  Progress: 6746 on 7353  Progress: 6747 on 7353  Progress: 6748 on 7353  Progress: 6749 on 7353  Progress: 6750 on 7353  Progress: 6751 on 7353  Progress: 6752 on 7353  Progress: 6753 on 7353  Progress: 6754 on 7353  Progress: 6755 on 7353  Progress: 6756 on 7353  Progress: 6757 on 7353  Progress: 6758 on 7353  Progress: 6759 on 7353  Progress: 6760 on 7353  Progress: 6761 on 7353  Progress: 6762 on 7353  Progress: 6763 on 7353  Progress: 6764 on 7353  Progress: 6765 on 7353  Progress: 6766 on 7353  Progress: 6767 on 7353  Progress: 6768 on 7353  Progress: 6769 on 7353  Progress: 6770 on 7353  Progress: 6771 on 7353  Progress: 6772 on 7353  Progress: 6773 on 7353  Progress: 6774 on 7353  Progress: 6775 on 7353  Progress: 6776 on 7353  Progress: 6777 on 7353  Progress: 6778 on 7353  Progress: 6779 on 7353  Progress: 6780 on 7353  Progress: 6781 on 7353  Progress: 6782 on 7353  Progress: 6783 on 7353  Progress: 6784 on 7353  Progress: 6785 on 7353  Progress: 6786 on 7353  Progress: 6787 on 7353  Progress: 6788 on 7353  Progress: 6789 on 7353  Progress: 6790 on 7353  Progress: 6791 on 7353  Progress: 6792 on 7353  Progress: 6793 on 7353  Progress: 6794 on 7353  Progress: 6795 on 7353  Progress: 6796 on 7353  Progress: 6797 on 7353  Progress: 6798 on 7353  Progress: 6799 on 7353  Progress: 6800 on 7353  Progress: 6801 on 7353  Progress: 6802 on 7353  Progress: 6803 on 7353  Progress: 6804 on 7353  Progress: 6805 on 7353  Progress: 6806 on 7353  Progress: 6807 on 7353  Progress: 6808 on 7353  Progress: 6809 on 7353  Progress: 6810 on 7353  Progress: 6811 on 7353  Progress: 6812 on 7353  Progress: 6813 on 7353  Progress: 6814 on 7353  Progress: 6815 on 7353  Progress: 6816 on 7353  Progress: 6817 on 7353  Progress: 6818 on 7353  Progress: 6819 on 7353  Progress: 6820 on 7353  Progress: 6821 on 7353  Progress: 6822 on 7353  Progress: 6823 on 7353  Progress: 6824 on 7353  Progress: 6825 on 7353  Progress: 6826 on 7353  Progress: 6827 on 7353  Progress: 6828 on 7353  Progress: 6829 on 7353  Progress: 6830 on 7353  Progress: 6831 on 7353  Progress: 6832 on 7353  Progress: 6833 on 7353  Progress: 6834 on 7353  Progress: 6835 on 7353  Progress: 6836 on 7353  Progress: 6837 on 7353  Progress: 6838 on 7353  Progress: 6839 on 7353  Progress: 6840 on 7353  Progress: 6841 on 7353  Progress: 6842 on 7353  Progress: 6843 on 7353  Progress: 6844 on 7353  Progress: 6845 on 7353  Progress: 6846 on 7353  Progress: 6847 on 7353  Progress: 6848 on 7353  Progress: 6849 on 7353  Progress: 6850 on 7353  Progress: 6851 on 7353  Progress: 6852 on 7353  Progress: 6853 on 7353  Progress: 6854 on 7353  Progress: 6855 on 7353  Progress: 6856 on 7353  Progress: 6857 on 7353  Progress: 6858 on 7353  Progress: 6859 on 7353  Progress: 6860 on 7353  Progress: 6861 on 7353  Progress: 6862 on 7353  Progress: 6863 on 7353  Progress: 6864 on 7353  Progress: 6865 on 7353  Progress: 6866 on 7353  Progress: 6867 on 7353  Progress: 6868 on 7353  Progress: 6869 on 7353  Progress: 6870 on 7353  Progress: 6871 on 7353  Progress: 6872 on 7353  Progress: 6873 on 7353  Progress: 6874 on 7353  Progress: 6875 on 7353  Progress: 6876 on 7353  Progress: 6877 on 7353  Progress: 6878 on 7353  Progress: 6879 on 7353  Progress: 6880 on 7353  Progress: 6881 on 7353  Progress: 6882 on 7353  Progress: 6883 on 7353  Progress: 6884 on 7353  Progress: 6885 on 7353  Progress: 6886 on 7353  Progress: 6887 on 7353  Progress: 6888 on 7353  Progress: 6889 on 7353  Progress: 6890 on 7353  Progress: 6891 on 7353  Progress: 6892 on 7353  Progress: 6893 on 7353  Progress: 6894 on 7353  Progress: 6895 on 7353  Progress: 6896 on 7353  Progress: 6897 on 7353  Progress: 6898 on 7353  Progress: 6899 on 7353  Progress: 6900 on 7353  Progress: 6901 on 7353  Progress: 6902 on 7353  Progress: 6903 on 7353  Progress: 6904 on 7353  Progress: 6905 on 7353  Progress: 6906 on 7353  Progress: 6907 on 7353  Progress: 6908 on 7353  Progress: 6909 on 7353  Progress: 6910 on 7353  Progress: 6911 on 7353  Progress: 6912 on 7353  Progress: 6913 on 7353  Progress: 6914 on 7353  Progress: 6915 on 7353  Progress: 6916 on 7353  Progress: 6917 on 7353  Progress: 6918 on 7353  Progress: 6919 on 7353  Progress: 6920 on 7353  Progress: 6921 on 7353  Progress: 6922 on 7353  Progress: 6923 on 7353  Progress: 6924 on 7353  Progress: 6925 on 7353  Progress: 6926 on 7353  Progress: 6927 on 7353  Progress: 6928 on 7353  Progress: 6929 on 7353  Progress: 6930 on 7353  Progress: 6931 on 7353  Progress: 6932 on 7353  Progress: 6933 on 7353  Progress: 6934 on 7353  Progress: 6935 on 7353  Progress: 6936 on 7353  Progress: 6937 on 7353  Progress: 6938 on 7353  Progress: 6939 on 7353  Progress: 6940 on 7353  Progress: 6941 on 7353  Progress: 6942 on 7353  Progress: 6943 on 7353  Progress: 6944 on 7353  Progress: 6945 on 7353  Progress: 6946 on 7353  Progress: 6947 on 7353  Progress: 6948 on 7353  Progress: 6949 on 7353  Progress: 6950 on 7353  Progress: 6951 on 7353  Progress: 6952 on 7353  Progress: 6953 on 7353  Progress: 6954 on 7353  Progress: 6955 on 7353  Progress: 6956 on 7353  Progress: 6957 on 7353  Progress: 6958 on 7353  Progress: 6959 on 7353  Progress: 6960 on 7353  Progress: 6961 on 7353  Progress: 6962 on 7353  Progress: 6963 on 7353  Progress: 6964 on 7353  Progress: 6965 on 7353  Progress: 6966 on 7353  Progress: 6967 on 7353  Progress: 6968 on 7353  Progress: 6969 on 7353  Progress: 6970 on 7353  Progress: 6971 on 7353  Progress: 6972 on 7353  Progress: 6973 on 7353  Progress: 6974 on 7353  Progress: 6975 on 7353  Progress: 6976 on 7353  Progress: 6977 on 7353  Progress: 6978 on 7353  Progress: 6979 on 7353  Progress: 6980 on 7353  Progress: 6981 on 7353  Progress: 6982 on 7353  Progress: 6983 on 7353  Progress: 6984 on 7353  Progress: 6985 on 7353  Progress: 6986 on 7353  Progress: 6987 on 7353  Progress: 6988 on 7353  Progress: 6989 on 7353  Progress: 6990 on 7353  Progress: 6991 on 7353  Progress: 6992 on 7353  Progress: 6993 on 7353  Progress: 6994 on 7353  Progress: 6995 on 7353  Progress: 6996 on 7353  Progress: 6997 on 7353  Progress: 6998 on 7353  Progress: 6999 on 7353  Progress: 7000 on 7353  Progress: 7001 on 7353  Progress: 7002 on 7353  Progress: 7003 on 7353  Progress: 7004 on 7353  Progress: 7005 on 7353  Progress: 7006 on 7353  Progress: 7007 on 7353  Progress: 7008 on 7353  Progress: 7009 on 7353  Progress: 7010 on 7353  Progress: 7011 on 7353  Progress: 7012 on 7353  Progress: 7013 on 7353  Progress: 7014 on 7353  Progress: 7015 on 7353  Progress: 7016 on 7353  Progress: 7017 on 7353  Progress: 7018 on 7353  Progress: 7019 on 7353  Progress: 7020 on 7353  Progress: 7021 on 7353  Progress: 7022 on 7353  Progress: 7023 on 7353  Progress: 7024 on 7353  Progress: 7025 on 7353  Progress: 7026 on 7353  Progress: 7027 on 7353  Progress: 7028 on 7353  Progress: 7029 on 7353  Progress: 7030 on 7353  Progress: 7031 on 7353  Progress: 7032 on 7353  Progress: 7033 on 7353  Progress: 7034 on 7353  Progress: 7035 on 7353  Progress: 7036 on 7353  Progress: 7037 on 7353  Progress: 7038 on 7353  Progress: 7039 on 7353  Progress: 7040 on 7353  Progress: 7041 on 7353  Progress: 7042 on 7353  Progress: 7043 on 7353  Progress: 7044 on 7353  Progress: 7045 on 7353  Progress: 7046 on 7353  Progress: 7047 on 7353  Progress: 7048 on 7353  Progress: 7049 on 7353  Progress: 7050 on 7353  Progress: 7051 on 7353  Progress: 7052 on 7353  Progress: 7053 on 7353  Progress: 7054 on 7353  Progress: 7055 on 7353  Progress: 7056 on 7353  Progress: 7057 on 7353  Progress: 7058 on 7353  Progress: 7059 on 7353  Progress: 7060 on 7353  Progress: 7061 on 7353  Progress: 7062 on 7353  Progress: 7063 on 7353  Progress: 7064 on 7353  Progress: 7065 on 7353  Progress: 7066 on 7353  Progress: 7067 on 7353  Progress: 7068 on 7353  Progress: 7069 on 7353  Progress: 7070 on 7353  Progress: 7071 on 7353  Progress: 7072 on 7353  Progress: 7073 on 7353  Progress: 7074 on 7353  Progress: 7075 on 7353  Progress: 7076 on 7353  Progress: 7077 on 7353  Progress: 7078 on 7353  Progress: 7079 on 7353  Progress: 7080 on 7353  Progress: 7081 on 7353  Progress: 7082 on 7353  Progress: 7083 on 7353  Progress: 7084 on 7353  Progress: 7085 on 7353  Progress: 7086 on 7353  Progress: 7087 on 7353  Progress: 7088 on 7353  Progress: 7089 on 7353  Progress: 7090 on 7353  Progress: 7091 on 7353  Progress: 7092 on 7353  Progress: 7093 on 7353  Progress: 7094 on 7353  Progress: 7095 on 7353  Progress: 7096 on 7353  Progress: 7097 on 7353  Progress: 7098 on 7353  Progress: 7099 on 7353  Progress: 7100 on 7353  Progress: 7101 on 7353  Progress: 7102 on 7353  Progress: 7103 on 7353  Progress: 7104 on 7353  Progress: 7105 on 7353  Progress: 7106 on 7353  Progress: 7107 on 7353  Progress: 7108 on 7353  Progress: 7109 on 7353  Progress: 7110 on 7353  Progress: 7111 on 7353  Progress: 7112 on 7353  Progress: 7113 on 7353  Progress: 7114 on 7353  Progress: 7115 on 7353  Progress: 7116 on 7353  Progress: 7117 on 7353  Progress: 7118 on 7353  Progress: 7119 on 7353  Progress: 7120 on 7353  Progress: 7121 on 7353  Progress: 7122 on 7353  Progress: 7123 on 7353  Progress: 7124 on 7353  Progress: 7125 on 7353  Progress: 7126 on 7353  Progress: 7127 on 7353  Progress: 7128 on 7353  Progress: 7129 on 7353  Progress: 7130 on 7353  Progress: 7131 on 7353  Progress: 7132 on 7353  Progress: 7133 on 7353  Progress: 7134 on 7353  Progress: 7135 on 7353  Progress: 7136 on 7353  Progress: 7137 on 7353  Progress: 7138 on 7353  Progress: 7139 on 7353  Progress: 7140 on 7353  Progress: 7141 on 7353  Progress: 7142 on 7353  Progress: 7143 on 7353  Progress: 7144 on 7353  Progress: 7145 on 7353  Progress: 7146 on 7353  Progress: 7147 on 7353  Progress: 7148 on 7353  Progress: 7149 on 7353  Progress: 7150 on 7353  Progress: 7151 on 7353  Progress: 7152 on 7353  Progress: 7153 on 7353  Progress: 7154 on 7353  Progress: 7155 on 7353  Progress: 7156 on 7353  Progress: 7157 on 7353  Progress: 7158 on 7353  Progress: 7159 on 7353  Progress: 7160 on 7353  Progress: 7161 on 7353  Progress: 7162 on 7353  Progress: 7163 on 7353  Progress: 7164 on 7353  Progress: 7165 on 7353  Progress: 7166 on 7353  Progress: 7167 on 7353  Progress: 7168 on 7353  Progress: 7169 on 7353  Progress: 7170 on 7353  Progress: 7171 on 7353  Progress: 7172 on 7353  Progress: 7173 on 7353  Progress: 7174 on 7353  Progress: 7175 on 7353  Progress: 7176 on 7353  Progress: 7177 on 7353  Progress: 7178 on 7353  Progress: 7179 on 7353  Progress: 7180 on 7353  Progress: 7181 on 7353  Progress: 7182 on 7353  Progress: 7183 on 7353  Progress: 7184 on 7353  Progress: 7185 on 7353  Progress: 7186 on 7353  Progress: 7187 on 7353  Progress: 7188 on 7353  Progress: 7189 on 7353  Progress: 7190 on 7353  Progress: 7191 on 7353  Progress: 7192 on 7353  Progress: 7193 on 7353  Progress: 7194 on 7353  Progress: 7195 on 7353  Progress: 7196 on 7353  Progress: 7197 on 7353  Progress: 7198 on 7353  Progress: 7199 on 7353  Progress: 7200 on 7353  Progress: 7201 on 7353  Progress: 7202 on 7353  Progress: 7203 on 7353  Progress: 7204 on 7353  Progress: 7205 on 7353  Progress: 7206 on 7353  Progress: 7207 on 7353  Progress: 7208 on 7353  Progress: 7209 on 7353  Progress: 7210 on 7353  Progress: 7211 on 7353  Progress: 7212 on 7353  Progress: 7213 on 7353  Progress: 7214 on 7353  Progress: 7215 on 7353  Progress: 7216 on 7353  Progress: 7217 on 7353  Progress: 7218 on 7353  Progress: 7219 on 7353  Progress: 7220 on 7353  Progress: 7221 on 7353  Progress: 7222 on 7353  Progress: 7223 on 7353  Progress: 7224 on 7353  Progress: 7225 on 7353  Progress: 7226 on 7353  Progress: 7227 on 7353  Progress: 7228 on 7353  Progress: 7229 on 7353  Progress: 7230 on 7353  Progress: 7231 on 7353  Progress: 7232 on 7353  Progress: 7233 on 7353  Progress: 7234 on 7353  Progress: 7235 on 7353  Progress: 7236 on 7353  Progress: 7237 on 7353  Progress: 7238 on 7353  Progress: 7239 on 7353  Progress: 7240 on 7353  Progress: 7241 on 7353  Progress: 7242 on 7353  Progress: 7243 on 7353  Progress: 7244 on 7353  Progress: 7245 on 7353  Progress: 7246 on 7353  Progress: 7247 on 7353  Progress: 7248 on 7353  Progress: 7249 on 7353  Progress: 7250 on 7353  Progress: 7251 on 7353  Progress: 7252 on 7353  Progress: 7253 on 7353  Progress: 7254 on 7353  Progress: 7255 on 7353  Progress: 7256 on 7353  Progress: 7257 on 7353  Progress: 7258 on 7353  Progress: 7259 on 7353  Progress: 7260 on 7353  Progress: 7261 on 7353  Progress: 7262 on 7353  Progress: 7263 on 7353  Progress: 7264 on 7353  Progress: 7265 on 7353  Progress: 7266 on 7353  Progress: 7267 on 7353  Progress: 7268 on 7353  Progress: 7269 on 7353  Progress: 7270 on 7353  Progress: 7271 on 7353  Progress: 7272 on 7353  Progress: 7273 on 7353  Progress: 7274 on 7353  Progress: 7275 on 7353  Progress: 7276 on 7353  Progress: 7277 on 7353  Progress: 7278 on 7353  Progress: 7279 on 7353  Progress: 7280 on 7353  Progress: 7281 on 7353  Progress: 7282 on 7353  Progress: 7283 on 7353  Progress: 7284 on 7353  Progress: 7285 on 7353  Progress: 7286 on 7353  Progress: 7287 on 7353  Progress: 7288 on 7353  Progress: 7289 on 7353  Progress: 7290 on 7353  Progress: 7291 on 7353  Progress: 7292 on 7353  Progress: 7293 on 7353  Progress: 7294 on 7353  Progress: 7295 on 7353  Progress: 7296 on 7353  Progress: 7297 on 7353  Progress: 7298 on 7353  Progress: 7299 on 7353  Progress: 7300 on 7353  Progress: 7301 on 7353  Progress: 7302 on 7353  Progress: 7303 on 7353  Progress: 7304 on 7353  Progress: 7305 on 7353  Progress: 7306 on 7353  Progress: 7307 on 7353  Progress: 7308 on 7353  Progress: 7309 on 7353  Progress: 7310 on 7353  Progress: 7311 on 7353  Progress: 7312 on 7353  Progress: 7313 on 7353  Progress: 7314 on 7353  Progress: 7315 on 7353  Progress: 7316 on 7353  Progress: 7317 on 7353  Progress: 7318 on 7353  Progress: 7319 on 7353  Progress: 7320 on 7353  Progress: 7321 on 7353  Progress: 7322 on 7353  Progress: 7323 on 7353  Progress: 7324 on 7353  Progress: 7325 on 7353  Progress: 7326 on 7353  Progress: 7327 on 7353  Progress: 7328 on 7353  Progress: 7329 on 7353  Progress: 7330 on 7353  Progress: 7331 on 7353  Progress: 7332 on 7353  Progress: 7333 on 7353  Progress: 7334 on 7353  Progress: 7335 on 7353  Progress: 7336 on 7353  Progress: 7337 on 7353  Progress: 7338 on 7353  Progress: 7339 on 7353  Progress: 7340 on 7353  Progress: 7341 on 7353  Progress: 7342 on 7353  Progress: 7343 on 7353  Progress: 7344 on 7353  Progress: 7345 on 7353  Progress: 7346 on 7353  Progress: 7347 on 7353  Progress: 7348 on 7353  Progress: 7349 on 7353  Progress: 7350 on 7353  Progress: 7351 on 7353  Progress: 7352 on 7353  Progress: 7353 on 7353  
BN_autor <- BN_autor %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 100 i 245. Porównaj pole autor w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE) %>%
  mutate(nazwa = str_replace_all(str_to_lower(paste(AM_NAZWISKO,AM_IMIE, sep = "")), "\\W", "")) %>%
  left_join(.,PBL_autorzy %>% select(AM_AUTOR_ID,AM_KRYPTONIM,AM_LICZBA_ZAPISOW,nazwa) %>% filter(is.na(AM_KRYPTONIM)),by="nazwa") %>%
  arrange(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,-AM_LICZBA_ZAPISOW)
BN_autor$id_grupy <- cumsum(!duplicated(BN_autor[1:3]))
BN_autor <- BN_autor[!duplicated(BN_autor$id_grupy),] %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE,AM_AUTOR_ID)

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(ZA_TYTUL = paste(`$a`,`$b`,`$n`,`$p`,sep = ""))

marc_field_245 <- marc_field_245 %>%
  mutate(ZA_TYTUL = paste(`$a`,`$b`,`$n`,`$p`,sep = " "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". ")) %>%
  select(ZA_UWAGI,ZA_TYTUL)
#dopisanie gatunku do przedmiotowej na podstawie 655 i 650  
gatunki_pbl <- data.frame(gatunek = c("aforyzm", "album", "antologia", "autobiografia", "dziennik", "esej", "felieton", "inne", "kazanie", "list", "miniatura prozą", "opowiadanie", "poemat", "powieść", "proza", "proza poetycka", "reportaż", "rozmyślanie religijne", "rysunek, obraz", "scenariusz", "szkic", "tekst biblijny", "tekst dramatyczny", "dramat", "wiersz", "wspomnienia", "wypowiedź", "pamiętniki", "poezja", "literatura podróżnicza", "satyra", "piosenka"))

#dramat, pamiętniki, poezja, literatura podróżnicza, satyra, piosenka
gatunki_bn <- data %>%
  select(ZA_UWAGI,X655,X650)

gatunki_bn <- sqldf("select *
                    from gatunki_bn
                    left join gatunki_pbl on lower(gatunki_bn.X655) like '%'||gatunki_pbl.gatunek||'%'")
gatunki_bn <- sqldf("select *
                      from gatunki_bn
                      left join gatunki_pbl on lower(gatunki_bn.X650) like '%'||gatunki_pbl.gatunek||'%'")
colnames(gatunki_bn)[5] <- "gatunek2"
gatunki_bn <- gatunki_bn %>%
  mutate(gatunek = ifelse(is.na(gatunek)&!is.na(gatunek2),as.character(gatunek2),as.character(gatunek)),
         gatunek = ifelse(grepl("przypowieść",X655,ignore.case = TRUE)&!grepl("[^y]powieść",X655)&gatunek=="powieść","opowiadanie",as.character(gatunek))) %>%
  filter(!is.na(gatunek)) %>%
  select(ZA_UWAGI,gatunek) %>%
  mutate(gatunek = ifelse(gatunek=="dramat","tekst dramatyczny",
                          ifelse(gatunek=="pamiętniki","wspomnienia",
                                 ifelse(gatunek=="poezja","wiersz",
                                        ifelse(gatunek=="literatura podróżnicza","reportaż",
                                               ifelse(gatunek=="piosenka","wiersz",as.character(gatunek))))))) %>%
  group_by(ZA_UWAGI) %>%
  mutate(gatunek = paste(gatunek,collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(gatunek = gsub("(^.)","\\U\\1",perl = TRUE, gatunek))
#połączenie tytułu z gatunkiem
za_tytul <- marc_field_245 %>%
  left_join(.,gatunki_bn,by="ZA_UWAGI") %>%
  mutate(ZA_TYTUL = ifelse(!is.na(gatunek)&(substr(ZA_TYTUL,nchar(ZA_TYTUL),nchar(ZA_TYTUL))=="."|substr(ZA_TYTUL,nchar(ZA_TYTUL),nchar(ZA_TYTUL))=="!"|substr(ZA_TYTUL,nchar(ZA_TYTUL),nchar(ZA_TYTUL))=="?"),paste(ZA_TYTUL," [",gatunek,"]",sep = ""),
                           ifelse(!is.na(gatunek)&(substr(ZA_TYTUL,nchar(ZA_TYTUL),nchar(ZA_TYTUL))!="."|substr(ZA_TYTUL,nchar(ZA_TYTUL),nchar(ZA_TYTUL))!="!"|substr(ZA_TYTUL,nchar(ZA_TYTUL),nchar(ZA_TYTUL))!="?"),paste(ZA_TYTUL,". [",gatunek,"]",sep = ""),as.character(ZA_TYTUL)))) %>%
  select(ZA_UWAGI,ZA_TYTUL)
#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_246 <- marc_field_246 %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(X246 = paste(`$a`,`$b`,`$n`,`$p`,sep = "")) %>%
  mutate(X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... ")) %>%
  select(ZA_UWAGI, X246)

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)
#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
Progress: 1 on 8  Progress: 2 on 8  Progress: 3 on 8  Progress: 4 on 8  Progress: 5 on 8  Progress: 6 on 8  Progress: 7 on 8  Progress: 8 on 8  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
Progress: 1 on 8  Progress: 2 on 8  Progress: 3 on 8  Progress: 4 on 8  Progress: 5 on 8  Progress: 6 on 8  Progress: 7 on 8  Progress: 8 on 8  
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}
Progress:    1 on 6223  Progress:    2 on 6223  Progress:    3 on 6223  Progress:    4 on 6223  Progress:    5 on 6223  Progress:    6 on 6223  Progress:    7 on 6223  Progress:    8 on 6223  Progress:    9 on 6223  Progress:   10 on 6223  Progress:   11 on 6223  Progress:   12 on 6223  Progress:   13 on 6223  Progress:   14 on 6223  Progress:   15 on 6223  Progress:   16 on 6223  Progress:   17 on 6223  Progress:   18 on 6223  Progress:   19 on 6223  Progress:   20 on 6223  Progress:   21 on 6223  Progress:   22 on 6223  Progress:   23 on 6223  Progress:   24 on 6223  Progress:   25 on 6223  Progress:   26 on 6223  Progress:   27 on 6223  Progress:   28 on 6223  Progress:   29 on 6223  Progress:   30 on 6223  Progress:   31 on 6223  Progress:   32 on 6223  Progress:   33 on 6223  Progress:   34 on 6223  Progress:   35 on 6223  Progress:   36 on 6223  Progress:   37 on 6223  Progress:   38 on 6223  Progress:   39 on 6223  Progress:   40 on 6223  Progress:   41 on 6223  Progress:   42 on 6223  Progress:   43 on 6223  Progress:   44 on 6223  Progress:   45 on 6223  Progress:   46 on 6223  Progress:   47 on 6223  Progress:   48 on 6223  Progress:   49 on 6223  Progress:   50 on 6223  Progress:   51 on 6223  Progress:   52 on 6223  Progress:   53 on 6223  Progress:   54 on 6223  Progress:   55 on 6223  Progress:   56 on 6223  Progress:   57 on 6223  Progress:   58 on 6223  Progress:   59 on 6223  Progress:   60 on 6223  Progress:   61 on 6223  Progress:   62 on 6223  Progress:   63 on 6223  Progress:   64 on 6223  Progress:   65 on 6223  Progress:   66 on 6223  Progress:   67 on 6223  Progress:   68 on 6223  Progress:   69 on 6223  Progress:   70 on 6223  Progress:   71 on 6223  Progress:   72 on 6223  Progress:   73 on 6223  Progress:   74 on 6223  Progress:   75 on 6223  Progress:   76 on 6223  Progress:   77 on 6223  Progress:   78 on 6223  Progress:   79 on 6223  Progress:   80 on 6223  Progress:   81 on 6223  Progress:   82 on 6223  Progress:   83 on 6223  Progress:   84 on 6223  Progress:   85 on 6223  Progress:   86 on 6223  Progress:   87 on 6223  Progress:   88 on 6223  Progress:   89 on 6223  Progress:   90 on 6223  Progress:   91 on 6223  Progress:   92 on 6223  Progress:   93 on 6223  Progress:   94 on 6223  Progress:   95 on 6223  Progress:   96 on 6223  Progress:   97 on 6223  Progress:   98 on 6223  Progress:   99 on 6223  Progress:  100 on 6223  Progress:  101 on 6223  Progress:  102 on 6223  Progress:  103 on 6223  Progress:  104 on 6223  Progress:  105 on 6223  Progress:  106 on 6223  Progress:  107 on 6223  Progress:  108 on 6223  Progress:  109 on 6223  Progress:  110 on 6223  Progress:  111 on 6223  Progress:  112 on 6223  Progress:  113 on 6223  Progress:  114 on 6223  Progress:  115 on 6223  Progress:  116 on 6223  Progress:  117 on 6223  Progress:  118 on 6223  Progress:  119 on 6223  Progress:  120 on 6223  Progress:  121 on 6223  Progress:  122 on 6223  Progress:  123 on 6223  Progress:  124 on 6223  Progress:  125 on 6223  Progress:  126 on 6223  Progress:  127 on 6223  Progress:  128 on 6223  Progress:  129 on 6223  Progress:  130 on 6223  Progress:  131 on 6223  Progress:  132 on 6223  Progress:  133 on 6223  Progress:  134 on 6223  Progress:  135 on 6223  Progress:  136 on 6223  Progress:  137 on 6223  Progress:  138 on 6223  Progress:  139 on 6223  Progress:  140 on 6223  Progress:  141 on 6223  Progress:  142 on 6223  Progress:  143 on 6223  Progress:  144 on 6223  Progress:  145 on 6223  Progress:  146 on 6223  Progress:  147 on 6223  Progress:  148 on 6223  Progress:  149 on 6223  Progress:  150 on 6223  Progress:  151 on 6223  Progress:  152 on 6223  Progress:  153 on 6223  Progress:  154 on 6223  Progress:  155 on 6223  Progress:  156 on 6223  Progress:  157 on 6223  Progress:  158 on 6223  Progress:  159 on 6223  Progress:  160 on 6223  Progress:  161 on 6223  Progress:  162 on 6223  Progress:  163 on 6223  Progress:  164 on 6223  Progress:  165 on 6223  Progress:  166 on 6223  Progress:  167 on 6223  Progress:  168 on 6223  Progress:  169 on 6223  Progress:  170 on 6223  Progress:  171 on 6223  Progress:  172 on 6223  Progress:  173 on 6223  Progress:  174 on 6223  Progress:  175 on 6223  Progress:  176 on 6223  Progress:  177 on 6223  Progress:  178 on 6223  Progress:  179 on 6223  Progress:  180 on 6223  Progress:  181 on 6223  Progress:  182 on 6223  Progress:  183 on 6223  Progress:  184 on 6223  Progress:  185 on 6223  Progress:  186 on 6223  Progress:  187 on 6223  Progress:  188 on 6223  Progress:  189 on 6223  Progress:  190 on 6223  Progress:  191 on 6223  Progress:  192 on 6223  Progress:  193 on 6223  Progress:  194 on 6223  Progress:  195 on 6223  Progress:  196 on 6223  Progress:  197 on 6223  Progress:  198 on 6223  Progress:  199 on 6223  Progress:  200 on 6223  Progress:  201 on 6223  Progress:  202 on 6223  Progress:  203 on 6223  Progress:  204 on 6223  Progress:  205 on 6223  Progress:  206 on 6223  Progress:  207 on 6223  Progress:  208 on 6223  Progress:  209 on 6223  Progress:  210 on 6223  Progress:  211 on 6223  Progress:  212 on 6223  Progress:  213 on 6223  Progress:  214 on 6223  Progress:  215 on 6223  Progress:  216 on 6223  Progress:  217 on 6223  Progress:  218 on 6223  Progress:  219 on 6223  Progress:  220 on 6223  Progress:  221 on 6223  Progress:  222 on 6223  Progress:  223 on 6223  Progress:  224 on 6223  Progress:  225 on 6223  Progress:  226 on 6223  Progress:  227 on 6223  Progress:  228 on 6223  Progress:  229 on 6223  Progress:  230 on 6223  Progress:  231 on 6223  Progress:  232 on 6223  Progress:  233 on 6223  Progress:  234 on 6223  Progress:  235 on 6223  Progress:  236 on 6223  Progress:  237 on 6223  Progress:  238 on 6223  Progress:  239 on 6223  Progress:  240 on 6223  Progress:  241 on 6223  Progress:  242 on 6223  Progress:  243 on 6223  Progress:  244 on 6223  Progress:  245 on 6223  Progress:  246 on 6223  Progress:  247 on 6223  Progress:  248 on 6223  Progress:  249 on 6223  Progress:  250 on 6223  Progress:  251 on 6223  Progress:  252 on 6223  Progress:  253 on 6223  Progress:  254 on 6223  Progress:  255 on 6223  Progress:  256 on 6223  Progress:  257 on 6223  Progress:  258 on 6223  Progress:  259 on 6223  Progress:  260 on 6223  Progress:  261 on 6223  Progress:  262 on 6223  Progress:  263 on 6223  Progress:  264 on 6223  Progress:  265 on 6223  Progress:  266 on 6223  Progress:  267 on 6223  Progress:  268 on 6223  Progress:  269 on 6223  Progress:  270 on 6223  Progress:  271 on 6223  Progress:  272 on 6223  Progress:  273 on 6223  Progress:  274 on 6223  Progress:  275 on 6223  Progress:  276 on 6223  Progress:  277 on 6223  Progress:  278 on 6223  Progress:  279 on 6223  Progress:  280 on 6223  Progress:  281 on 6223  Progress:  282 on 6223  Progress:  283 on 6223  Progress:  284 on 6223  Progress:  285 on 6223  Progress:  286 on 6223  Progress:  287 on 6223  Progress:  288 on 6223  Progress:  289 on 6223  Progress:  290 on 6223  Progress:  291 on 6223  Progress:  292 on 6223  Progress:  293 on 6223  Progress:  294 on 6223  Progress:  295 on 6223  Progress:  296 on 6223  Progress:  297 on 6223  Progress:  298 on 6223  Progress:  299 on 6223  Progress:  300 on 6223  Progress:  301 on 6223  Progress:  302 on 6223  Progress:  303 on 6223  Progress:  304 on 6223  Progress:  305 on 6223  Progress:  306 on 6223  Progress:  307 on 6223  Progress:  308 on 6223  Progress:  309 on 6223  Progress:  310 on 6223  Progress:  311 on 6223  Progress:  312 on 6223  Progress:  313 on 6223  Progress:  314 on 6223  Progress:  315 on 6223  Progress:  316 on 6223  Progress:  317 on 6223  Progress:  318 on 6223  Progress:  319 on 6223  Progress:  320 on 6223  Progress:  321 on 6223  Progress:  322 on 6223  Progress:  323 on 6223  Progress:  324 on 6223  Progress:  325 on 6223  Progress:  326 on 6223  Progress:  327 on 6223  Progress:  328 on 6223  Progress:  329 on 6223  Progress:  330 on 6223  Progress:  331 on 6223  Progress:  332 on 6223  Progress:  333 on 6223  Progress:  334 on 6223  Progress:  335 on 6223  Progress:  336 on 6223  Progress:  337 on 6223  Progress:  338 on 6223  Progress:  339 on 6223  Progress:  340 on 6223  Progress:  341 on 6223  Progress:  342 on 6223  Progress:  343 on 6223  Progress:  344 on 6223  Progress:  345 on 6223  Progress:  346 on 6223  Progress:  347 on 6223  Progress:  348 on 6223  Progress:  349 on 6223  Progress:  350 on 6223  Progress:  351 on 6223  Progress:  352 on 6223  Progress:  353 on 6223  Progress:  354 on 6223  Progress:  355 on 6223  Progress:  356 on 6223  Progress:  357 on 6223  Progress:  358 on 6223  Progress:  359 on 6223  Progress:  360 on 6223  Progress:  361 on 6223  Progress:  362 on 6223  Progress:  363 on 6223  Progress:  364 on 6223  Progress:  365 on 6223  Progress:  366 on 6223  Progress:  367 on 6223  Progress:  368 on 6223  Progress:  369 on 6223  Progress:  370 on 6223  Progress:  371 on 6223  Progress:  372 on 6223  Progress:  373 on 6223  Progress:  374 on 6223  Progress:  375 on 6223  Progress:  376 on 6223  Progress:  377 on 6223  Progress:  378 on 6223  Progress:  379 on 6223  Progress:  380 on 6223  Progress:  381 on 6223  Progress:  382 on 6223  Progress:  383 on 6223  Progress:  384 on 6223  Progress:  385 on 6223  Progress:  386 on 6223  Progress:  387 on 6223  Progress:  388 on 6223  Progress:  389 on 6223  Progress:  390 on 6223  Progress:  391 on 6223  Progress:  392 on 6223  Progress:  393 on 6223  Progress:  394 on 6223  Progress:  395 on 6223  Progress:  396 on 6223  Progress:  397 on 6223  Progress:  398 on 6223  Progress:  399 on 6223  Progress:  400 on 6223  Progress:  401 on 6223  Progress:  402 on 6223  Progress:  403 on 6223  Progress:  404 on 6223  Progress:  405 on 6223  Progress:  406 on 6223  Progress:  407 on 6223  Progress:  408 on 6223  Progress:  409 on 6223  Progress:  410 on 6223  Progress:  411 on 6223  Progress:  412 on 6223  Progress:  413 on 6223  Progress:  414 on 6223  Progress:  415 on 6223  Progress:  416 on 6223  Progress:  417 on 6223  Progress:  418 on 6223  Progress:  419 on 6223  Progress:  420 on 6223  Progress:  421 on 6223  Progress:  422 on 6223  Progress:  423 on 6223  Progress:  424 on 6223  Progress:  425 on 6223  Progress:  426 on 6223  Progress:  427 on 6223  Progress:  428 on 6223  Progress:  429 on 6223  Progress:  430 on 6223  Progress:  431 on 6223  Progress:  432 on 6223  Progress:  433 on 6223  Progress:  434 on 6223  Progress:  435 on 6223  Progress:  436 on 6223  Progress:  437 on 6223  Progress:  438 on 6223  Progress:  439 on 6223  Progress:  440 on 6223  Progress:  441 on 6223  Progress:  442 on 6223  Progress:  443 on 6223  Progress:  444 on 6223  Progress:  445 on 6223  Progress:  446 on 6223  Progress:  447 on 6223  Progress:  448 on 6223  Progress:  449 on 6223  Progress:  450 on 6223  Progress:  451 on 6223  Progress:  452 on 6223  Progress:  453 on 6223  Progress:  454 on 6223  Progress:  455 on 6223  Progress:  456 on 6223  Progress:  457 on 6223  Progress:  458 on 6223  Progress:  459 on 6223  Progress:  460 on 6223  Progress:  461 on 6223  Progress:  462 on 6223  Progress:  463 on 6223  Progress:  464 on 6223  Progress:  465 on 6223  Progress:  466 on 6223  Progress:  467 on 6223  Progress:  468 on 6223  Progress:  469 on 6223  Progress:  470 on 6223  Progress:  471 on 6223  Progress:  472 on 6223  Progress:  473 on 6223  Progress:  474 on 6223  Progress:  475 on 6223  Progress:  476 on 6223  Progress:  477 on 6223  Progress:  478 on 6223  Progress:  479 on 6223  Progress:  480 on 6223  Progress:  481 on 6223  Progress:  482 on 6223  Progress:  483 on 6223  Progress:  484 on 6223  Progress:  485 on 6223  Progress:  486 on 6223  Progress:  487 on 6223  Progress:  488 on 6223  Progress:  489 on 6223  Progress:  490 on 6223  Progress:  491 on 6223  Progress:  492 on 6223  Progress:  493 on 6223  Progress:  494 on 6223  Progress:  495 on 6223  Progress:  496 on 6223  Progress:  497 on 6223  Progress:  498 on 6223  Progress:  499 on 6223  Progress:  500 on 6223  Progress:  501 on 6223  Progress:  502 on 6223  Progress:  503 on 6223  Progress:  504 on 6223  Progress:  505 on 6223  Progress:  506 on 6223  Progress:  507 on 6223  Progress:  508 on 6223  Progress:  509 on 6223  Progress:  510 on 6223  Progress:  511 on 6223  Progress:  512 on 6223  Progress:  513 on 6223  Progress:  514 on 6223  Progress:  515 on 6223  Progress:  516 on 6223  Progress:  517 on 6223  Progress:  518 on 6223  Progress:  519 on 6223  Progress:  520 on 6223  Progress:  521 on 6223  Progress:  522 on 6223  Progress:  523 on 6223  Progress:  524 on 6223  Progress:  525 on 6223  Progress:  526 on 6223  Progress:  527 on 6223  Progress:  528 on 6223  Progress:  529 on 6223  Progress:  530 on 6223  Progress:  531 on 6223  Progress:  532 on 6223  Progress:  533 on 6223  Progress:  534 on 6223  Progress:  535 on 6223  Progress:  536 on 6223  Progress:  537 on 6223  Progress:  538 on 6223  Progress:  539 on 6223  Progress:  540 on 6223  Progress:  541 on 6223  Progress:  542 on 6223  Progress:  543 on 6223  Progress:  544 on 6223  Progress:  545 on 6223  Progress:  546 on 6223  Progress:  547 on 6223  Progress:  548 on 6223  Progress:  549 on 6223  Progress:  550 on 6223  Progress:  551 on 6223  Progress:  552 on 6223  Progress:  553 on 6223  Progress:  554 on 6223  Progress:  555 on 6223  Progress:  556 on 6223  Progress:  557 on 6223  Progress:  558 on 6223  Progress:  559 on 6223  Progress:  560 on 6223  Progress:  561 on 6223  Progress:  562 on 6223  Progress:  563 on 6223  Progress:  564 on 6223  Progress:  565 on 6223  Progress:  566 on 6223  Progress:  567 on 6223  Progress:  568 on 6223  Progress:  569 on 6223  Progress:  570 on 6223  Progress:  571 on 6223  Progress:  572 on 6223  Progress:  573 on 6223  Progress:  574 on 6223  Progress:  575 on 6223  Progress:  576 on 6223  Progress:  577 on 6223  Progress:  578 on 6223  Progress:  579 on 6223  Progress:  580 on 6223  Progress:  581 on 6223  Progress:  582 on 6223  Progress:  583 on 6223  Progress:  584 on 6223  Progress:  585 on 6223  Progress:  586 on 6223  Progress:  587 on 6223  Progress:  588 on 6223  Progress:  589 on 6223  Progress:  590 on 6223  Progress:  591 on 6223  Progress:  592 on 6223  Progress:  593 on 6223  Progress:  594 on 6223  Progress:  595 on 6223  Progress:  596 on 6223  Progress:  597 on 6223  Progress:  598 on 6223  Progress:  599 on 6223  Progress:  600 on 6223  Progress:  601 on 6223  Progress:  602 on 6223  Progress:  603 on 6223  Progress:  604 on 6223  Progress:  605 on 6223  Progress:  606 on 6223  Progress:  607 on 6223  Progress:  608 on 6223  Progress:  609 on 6223  Progress:  610 on 6223  Progress:  611 on 6223  Progress:  612 on 6223  Progress:  613 on 6223  Progress:  614 on 6223  Progress:  615 on 6223  Progress:  616 on 6223  Progress:  617 on 6223  Progress:  618 on 6223  Progress:  619 on 6223  Progress:  620 on 6223  Progress:  621 on 6223  Progress:  622 on 6223  Progress:  623 on 6223  Progress:  624 on 6223  Progress:  625 on 6223  Progress:  626 on 6223  Progress:  627 on 6223  Progress:  628 on 6223  Progress:  629 on 6223  Progress:  630 on 6223  Progress:  631 on 6223  Progress:  632 on 6223  Progress:  633 on 6223  Progress:  634 on 6223  Progress:  635 on 6223  Progress:  636 on 6223  Progress:  637 on 6223  Progress:  638 on 6223  Progress:  639 on 6223  Progress:  640 on 6223  Progress:  641 on 6223  Progress:  642 on 6223  Progress:  643 on 6223  Progress:  644 on 6223  Progress:  645 on 6223  Progress:  646 on 6223  Progress:  647 on 6223  Progress:  648 on 6223  Progress:  649 on 6223  Progress:  650 on 6223  Progress:  651 on 6223  Progress:  652 on 6223  Progress:  653 on 6223  Progress:  654 on 6223  Progress:  655 on 6223  Progress:  656 on 6223  Progress:  657 on 6223  Progress:  658 on 6223  Progress:  659 on 6223  Progress:  660 on 6223  Progress:  661 on 6223  Progress:  662 on 6223  Progress:  663 on 6223  Progress:  664 on 6223  Progress:  665 on 6223  Progress:  666 on 6223  Progress:  667 on 6223  Progress:  668 on 6223  Progress:  669 on 6223  Progress:  670 on 6223  Progress:  671 on 6223  Progress:  672 on 6223  Progress:  673 on 6223  Progress:  674 on 6223  Progress:  675 on 6223  Progress:  676 on 6223  Progress:  677 on 6223  Progress:  678 on 6223  Progress:  679 on 6223  Progress:  680 on 6223  Progress:  681 on 6223  Progress:  682 on 6223  Progress:  683 on 6223  Progress:  684 on 6223  Progress:  685 on 6223  Progress:  686 on 6223  Progress:  687 on 6223  Progress:  688 on 6223  Progress:  689 on 6223  Progress:  690 on 6223  Progress:  691 on 6223  Progress:  692 on 6223  Progress:  693 on 6223  Progress:  694 on 6223  Progress:  695 on 6223  Progress:  696 on 6223  Progress:  697 on 6223  Progress:  698 on 6223  Progress:  699 on 6223  Progress:  700 on 6223  Progress:  701 on 6223  Progress:  702 on 6223  Progress:  703 on 6223  Progress:  704 on 6223  Progress:  705 on 6223  Progress:  706 on 6223  Progress:  707 on 6223  Progress:  708 on 6223  Progress:  709 on 6223  Progress:  710 on 6223  Progress:  711 on 6223  Progress:  712 on 6223  Progress:  713 on 6223  Progress:  714 on 6223  Progress:  715 on 6223  Progress:  716 on 6223  Progress:  717 on 6223  Progress:  718 on 6223  Progress:  719 on 6223  Progress:  720 on 6223  Progress:  721 on 6223  Progress:  722 on 6223  Progress:  723 on 6223  Progress:  724 on 6223  Progress:  725 on 6223  Progress:  726 on 6223  Progress:  727 on 6223  Progress:  728 on 6223  Progress:  729 on 6223  Progress:  730 on 6223  Progress:  731 on 6223  Progress:  732 on 6223  Progress:  733 on 6223  Progress:  734 on 6223  Progress:  735 on 6223  Progress:  736 on 6223  Progress:  737 on 6223  Progress:  738 on 6223  Progress:  739 on 6223  Progress:  740 on 6223  Progress:  741 on 6223  Progress:  742 on 6223  Progress:  743 on 6223  Progress:  744 on 6223  Progress:  745 on 6223  Progress:  746 on 6223  Progress:  747 on 6223  Progress:  748 on 6223  Progress:  749 on 6223  Progress:  750 on 6223  Progress:  751 on 6223  Progress:  752 on 6223  Progress:  753 on 6223  Progress:  754 on 6223  Progress:  755 on 6223  Progress:  756 on 6223  Progress:  757 on 6223  Progress:  758 on 6223  Progress:  759 on 6223  Progress:  760 on 6223  Progress:  761 on 6223  Progress:  762 on 6223  Progress:  763 on 6223  Progress:  764 on 6223  Progress:  765 on 6223  Progress:  766 on 6223  Progress:  767 on 6223  Progress:  768 on 6223  Progress:  769 on 6223  Progress:  770 on 6223  Progress:  771 on 6223  Progress:  772 on 6223  Progress:  773 on 6223  Progress:  774 on 6223  Progress:  775 on 6223  Progress:  776 on 6223  Progress:  777 on 6223  Progress:  778 on 6223  Progress:  779 on 6223  Progress:  780 on 6223  Progress:  781 on 6223  Progress:  782 on 6223  Progress:  783 on 6223  Progress:  784 on 6223  Progress:  785 on 6223  Progress:  786 on 6223  Progress:  787 on 6223  Progress:  788 on 6223  Progress:  789 on 6223  Progress:  790 on 6223  Progress:  791 on 6223  Progress:  792 on 6223  Progress:  793 on 6223  Progress:  794 on 6223  Progress:  795 on 6223  Progress:  796 on 6223  Progress:  797 on 6223  Progress:  798 on 6223  Progress:  799 on 6223  Progress:  800 on 6223  Progress:  801 on 6223  Progress:  802 on 6223  Progress:  803 on 6223  Progress:  804 on 6223  Progress:  805 on 6223  Progress:  806 on 6223  Progress:  807 on 6223  Progress:  808 on 6223  Progress:  809 on 6223  Progress:  810 on 6223  Progress:  811 on 6223  Progress:  812 on 6223  Progress:  813 on 6223  Progress:  814 on 6223  Progress:  815 on 6223  Progress:  816 on 6223  Progress:  817 on 6223  Progress:  818 on 6223  Progress:  819 on 6223  Progress:  820 on 6223  Progress:  821 on 6223  Progress:  822 on 6223  Progress:  823 on 6223  Progress:  824 on 6223  Progress:  825 on 6223  Progress:  826 on 6223  Progress:  827 on 6223  Progress:  828 on 6223  Progress:  829 on 6223  Progress:  830 on 6223  Progress:  831 on 6223  Progress:  832 on 6223  Progress:  833 on 6223  Progress:  834 on 6223  Progress:  835 on 6223  Progress:  836 on 6223  Progress:  837 on 6223  Progress:  838 on 6223  Progress:  839 on 6223  Progress:  840 on 6223  Progress:  841 on 6223  Progress:  842 on 6223  Progress:  843 on 6223  Progress:  844 on 6223  Progress:  845 on 6223  Progress:  846 on 6223  Progress:  847 on 6223  Progress:  848 on 6223  Progress:  849 on 6223  Progress:  850 on 6223  Progress:  851 on 6223  Progress:  852 on 6223  Progress:  853 on 6223  Progress:  854 on 6223  Progress:  855 on 6223  Progress:  856 on 6223  Progress:  857 on 6223  Progress:  858 on 6223  Progress:  859 on 6223  Progress:  860 on 6223  Progress:  861 on 6223  Progress:  862 on 6223  Progress:  863 on 6223  Progress:  864 on 6223  Progress:  865 on 6223  Progress:  866 on 6223  Progress:  867 on 6223  Progress:  868 on 6223  Progress:  869 on 6223  Progress:  870 on 6223  Progress:  871 on 6223  Progress:  872 on 6223  Progress:  873 on 6223  Progress:  874 on 6223  Progress:  875 on 6223  Progress:  876 on 6223  Progress:  877 on 6223  Progress:  878 on 6223  Progress:  879 on 6223  Progress:  880 on 6223  Progress:  881 on 6223  Progress:  882 on 6223  Progress:  883 on 6223  Progress:  884 on 6223  Progress:  885 on 6223  Progress:  886 on 6223  Progress:  887 on 6223  Progress:  888 on 6223  Progress:  889 on 6223  Progress:  890 on 6223  Progress:  891 on 6223  Progress:  892 on 6223  Progress:  893 on 6223  Progress:  894 on 6223  Progress:  895 on 6223  Progress:  896 on 6223  Progress:  897 on 6223  Progress:  898 on 6223  Progress:  899 on 6223  Progress:  900 on 6223  Progress:  901 on 6223  Progress:  902 on 6223  Progress:  903 on 6223  Progress:  904 on 6223  Progress:  905 on 6223  Progress:  906 on 6223  Progress:  907 on 6223  Progress:  908 on 6223  Progress:  909 on 6223  Progress:  910 on 6223  Progress:  911 on 6223  Progress:  912 on 6223  Progress:  913 on 6223  Progress:  914 on 6223  Progress:  915 on 6223  Progress:  916 on 6223  Progress:  917 on 6223  Progress:  918 on 6223  Progress:  919 on 6223  Progress:  920 on 6223  Progress:  921 on 6223  Progress:  922 on 6223  Progress:  923 on 6223  Progress:  924 on 6223  Progress:  925 on 6223  Progress:  926 on 6223  Progress:  927 on 6223  Progress:  928 on 6223  Progress:  929 on 6223  Progress:  930 on 6223  Progress:  931 on 6223  Progress:  932 on 6223  Progress:  933 on 6223  Progress:  934 on 6223  Progress:  935 on 6223  Progress:  936 on 6223  Progress:  937 on 6223  Progress:  938 on 6223  Progress:  939 on 6223  Progress:  940 on 6223  Progress:  941 on 6223  Progress:  942 on 6223  Progress:  943 on 6223  Progress:  944 on 6223  Progress:  945 on 6223  Progress:  946 on 6223  Progress:  947 on 6223  Progress:  948 on 6223  Progress:  949 on 6223  Progress:  950 on 6223  Progress:  951 on 6223  Progress:  952 on 6223  Progress:  953 on 6223  Progress:  954 on 6223  Progress:  955 on 6223  Progress:  956 on 6223  Progress:  957 on 6223  Progress:  958 on 6223  Progress:  959 on 6223  Progress:  960 on 6223  Progress:  961 on 6223  Progress:  962 on 6223  Progress:  963 on 6223  Progress:  964 on 6223  Progress:  965 on 6223  Progress:  966 on 6223  Progress:  967 on 6223  Progress:  968 on 6223  Progress:  969 on 6223  Progress:  970 on 6223  Progress:  971 on 6223  Progress:  972 on 6223  Progress:  973 on 6223  Progress:  974 on 6223  Progress:  975 on 6223  Progress:  976 on 6223  Progress:  977 on 6223  Progress:  978 on 6223  Progress:  979 on 6223  Progress:  980 on 6223  Progress:  981 on 6223  Progress:  982 on 6223  Progress:  983 on 6223  Progress:  984 on 6223  Progress:  985 on 6223  Progress:  986 on 6223  Progress:  987 on 6223  Progress:  988 on 6223  Progress:  989 on 6223  Progress:  990 on 6223  Progress:  991 on 6223  Progress:  992 on 6223  Progress:  993 on 6223  Progress:  994 on 6223  Progress:  995 on 6223  Progress:  996 on 6223  Progress:  997 on 6223  Progress:  998 on 6223  Progress:  999 on 6223  Progress: 1000 on 6223  Progress: 1001 on 6223  Progress: 1002 on 6223  Progress: 1003 on 6223  Progress: 1004 on 6223  Progress: 1005 on 6223  Progress: 1006 on 6223  Progress: 1007 on 6223  Progress: 1008 on 6223  Progress: 1009 on 6223  Progress: 1010 on 6223  Progress: 1011 on 6223  Progress: 1012 on 6223  Progress: 1013 on 6223  Progress: 1014 on 6223  Progress: 1015 on 6223  Progress: 1016 on 6223  Progress: 1017 on 6223  Progress: 1018 on 6223  Progress: 1019 on 6223  Progress: 1020 on 6223  Progress: 1021 on 6223  Progress: 1022 on 6223  Progress: 1023 on 6223  Progress: 1024 on 6223  Progress: 1025 on 6223  Progress: 1026 on 6223  Progress: 1027 on 6223  Progress: 1028 on 6223  Progress: 1029 on 6223  Progress: 1030 on 6223  Progress: 1031 on 6223  Progress: 1032 on 6223  Progress: 1033 on 6223  Progress: 1034 on 6223  Progress: 1035 on 6223  Progress: 1036 on 6223  Progress: 1037 on 6223  Progress: 1038 on 6223  Progress: 1039 on 6223  Progress: 1040 on 6223  Progress: 1041 on 6223  Progress: 1042 on 6223  Progress: 1043 on 6223  Progress: 1044 on 6223  Progress: 1045 on 6223  Progress: 1046 on 6223  Progress: 1047 on 6223  Progress: 1048 on 6223  Progress: 1049 on 6223  Progress: 1050 on 6223  Progress: 1051 on 6223  Progress: 1052 on 6223  Progress: 1053 on 6223  Progress: 1054 on 6223  Progress: 1055 on 6223  Progress: 1056 on 6223  Progress: 1057 on 6223  Progress: 1058 on 6223  Progress: 1059 on 6223  Progress: 1060 on 6223  Progress: 1061 on 6223  Progress: 1062 on 6223  Progress: 1063 on 6223  Progress: 1064 on 6223  Progress: 1065 on 6223  Progress: 1066 on 6223  Progress: 1067 on 6223  Progress: 1068 on 6223  Progress: 1069 on 6223  Progress: 1070 on 6223  Progress: 1071 on 6223  Progress: 1072 on 6223  Progress: 1073 on 6223  Progress: 1074 on 6223  Progress: 1075 on 6223  Progress: 1076 on 6223  Progress: 1077 on 6223  Progress: 1078 on 6223  Progress: 1079 on 6223  Progress: 1080 on 6223  Progress: 1081 on 6223  Progress: 1082 on 6223  Progress: 1083 on 6223  Progress: 1084 on 6223  Progress: 1085 on 6223  Progress: 1086 on 6223  Progress: 1087 on 6223  Progress: 1088 on 6223  Progress: 1089 on 6223  Progress: 1090 on 6223  Progress: 1091 on 6223  Progress: 1092 on 6223  Progress: 1093 on 6223  Progress: 1094 on 6223  Progress: 1095 on 6223  Progress: 1096 on 6223  Progress: 1097 on 6223  Progress: 1098 on 6223  Progress: 1099 on 6223  Progress: 1100 on 6223  Progress: 1101 on 6223  Progress: 1102 on 6223  Progress: 1103 on 6223  Progress: 1104 on 6223  Progress: 1105 on 6223  Progress: 1106 on 6223  Progress: 1107 on 6223  Progress: 1108 on 6223  Progress: 1109 on 6223  Progress: 1110 on 6223  Progress: 1111 on 6223  Progress: 1112 on 6223  Progress: 1113 on 6223  Progress: 1114 on 6223  Progress: 1115 on 6223  Progress: 1116 on 6223  Progress: 1117 on 6223  Progress: 1118 on 6223  Progress: 1119 on 6223  Progress: 1120 on 6223  Progress: 1121 on 6223  Progress: 1122 on 6223  Progress: 1123 on 6223  Progress: 1124 on 6223  Progress: 1125 on 6223  Progress: 1126 on 6223  Progress: 1127 on 6223  Progress: 1128 on 6223  Progress: 1129 on 6223  Progress: 1130 on 6223  Progress: 1131 on 6223  Progress: 1132 on 6223  Progress: 1133 on 6223  Progress: 1134 on 6223  Progress: 1135 on 6223  Progress: 1136 on 6223  Progress: 1137 on 6223  Progress: 1138 on 6223  Progress: 1139 on 6223  Progress: 1140 on 6223  Progress: 1141 on 6223  Progress: 1142 on 6223  Progress: 1143 on 6223  Progress: 1144 on 6223  Progress: 1145 on 6223  Progress: 1146 on 6223  Progress: 1147 on 6223  Progress: 1148 on 6223  Progress: 1149 on 6223  Progress: 1150 on 6223  Progress: 1151 on 6223  Progress: 1152 on 6223  Progress: 1153 on 6223  Progress: 1154 on 6223  Progress: 1155 on 6223  Progress: 1156 on 6223  Progress: 1157 on 6223  Progress: 1158 on 6223  Progress: 1159 on 6223  Progress: 1160 on 6223  Progress: 1161 on 6223  Progress: 1162 on 6223  Progress: 1163 on 6223  Progress: 1164 on 6223  Progress: 1165 on 6223  Progress: 1166 on 6223  Progress: 1167 on 6223  Progress: 1168 on 6223  Progress: 1169 on 6223  Progress: 1170 on 6223  Progress: 1171 on 6223  Progress: 1172 on 6223  Progress: 1173 on 6223  Progress: 1174 on 6223  Progress: 1175 on 6223  Progress: 1176 on 6223  Progress: 1177 on 6223  Progress: 1178 on 6223  Progress: 1179 on 6223  Progress: 1180 on 6223  Progress: 1181 on 6223  Progress: 1182 on 6223  Progress: 1183 on 6223  Progress: 1184 on 6223  Progress: 1185 on 6223  Progress: 1186 on 6223  Progress: 1187 on 6223  Progress: 1188 on 6223  Progress: 1189 on 6223  Progress: 1190 on 6223  Progress: 1191 on 6223  Progress: 1192 on 6223  Progress: 1193 on 6223  Progress: 1194 on 6223  Progress: 1195 on 6223  Progress: 1196 on 6223  Progress: 1197 on 6223  Progress: 1198 on 6223  Progress: 1199 on 6223  Progress: 1200 on 6223  Progress: 1201 on 6223  Progress: 1202 on 6223  Progress: 1203 on 6223  Progress: 1204 on 6223  Progress: 1205 on 6223  Progress: 1206 on 6223  Progress: 1207 on 6223  Progress: 1208 on 6223  Progress: 1209 on 6223  Progress: 1210 on 6223  Progress: 1211 on 6223  Progress: 1212 on 6223  Progress: 1213 on 6223  Progress: 1214 on 6223  Progress: 1215 on 6223  Progress: 1216 on 6223  Progress: 1217 on 6223  Progress: 1218 on 6223  Progress: 1219 on 6223  Progress: 1220 on 6223  Progress: 1221 on 6223  Progress: 1222 on 6223  Progress: 1223 on 6223  Progress: 1224 on 6223  Progress: 1225 on 6223  Progress: 1226 on 6223  Progress: 1227 on 6223  Progress: 1228 on 6223  Progress: 1229 on 6223  Progress: 1230 on 6223  Progress: 1231 on 6223  Progress: 1232 on 6223  Progress: 1233 on 6223  Progress: 1234 on 6223  Progress: 1235 on 6223  Progress: 1236 on 6223  Progress: 1237 on 6223  Progress: 1238 on 6223  Progress: 1239 on 6223  Progress: 1240 on 6223  Progress: 1241 on 6223  Progress: 1242 on 6223  Progress: 1243 on 6223  Progress: 1244 on 6223  Progress: 1245 on 6223  Progress: 1246 on 6223  Progress: 1247 on 6223  Progress: 1248 on 6223  Progress: 1249 on 6223  Progress: 1250 on 6223  Progress: 1251 on 6223  Progress: 1252 on 6223  Progress: 1253 on 6223  Progress: 1254 on 6223  Progress: 1255 on 6223  Progress: 1256 on 6223  Progress: 1257 on 6223  Progress: 1258 on 6223  Progress: 1259 on 6223  Progress: 1260 on 6223  Progress: 1261 on 6223  Progress: 1262 on 6223  Progress: 1263 on 6223  Progress: 1264 on 6223  Progress: 1265 on 6223  Progress: 1266 on 6223  Progress: 1267 on 6223  Progress: 1268 on 6223  Progress: 1269 on 6223  Progress: 1270 on 6223  Progress: 1271 on 6223  Progress: 1272 on 6223  Progress: 1273 on 6223  Progress: 1274 on 6223  Progress: 1275 on 6223  Progress: 1276 on 6223  Progress: 1277 on 6223  Progress: 1278 on 6223  Progress: 1279 on 6223  Progress: 1280 on 6223  Progress: 1281 on 6223  Progress: 1282 on 6223  Progress: 1283 on 6223  Progress: 1284 on 6223  Progress: 1285 on 6223  Progress: 1286 on 6223  Progress: 1287 on 6223  Progress: 1288 on 6223  Progress: 1289 on 6223  Progress: 1290 on 6223  Progress: 1291 on 6223  Progress: 1292 on 6223  Progress: 1293 on 6223  Progress: 1294 on 6223  Progress: 1295 on 6223  Progress: 1296 on 6223  Progress: 1297 on 6223  Progress: 1298 on 6223  Progress: 1299 on 6223  Progress: 1300 on 6223  Progress: 1301 on 6223  Progress: 1302 on 6223  Progress: 1303 on 6223  Progress: 1304 on 6223  Progress: 1305 on 6223  Progress: 1306 on 6223  Progress: 1307 on 6223  Progress: 1308 on 6223  Progress: 1309 on 6223  Progress: 1310 on 6223  Progress: 1311 on 6223  Progress: 1312 on 6223  Progress: 1313 on 6223  Progress: 1314 on 6223  Progress: 1315 on 6223  Progress: 1316 on 6223  Progress: 1317 on 6223  Progress: 1318 on 6223  Progress: 1319 on 6223  Progress: 1320 on 6223  Progress: 1321 on 6223  Progress: 1322 on 6223  Progress: 1323 on 6223  Progress: 1324 on 6223  Progress: 1325 on 6223  Progress: 1326 on 6223  Progress: 1327 on 6223  Progress: 1328 on 6223  Progress: 1329 on 6223  Progress: 1330 on 6223  Progress: 1331 on 6223  Progress: 1332 on 6223  Progress: 1333 on 6223  Progress: 1334 on 6223  Progress: 1335 on 6223  Progress: 1336 on 6223  Progress: 1337 on 6223  Progress: 1338 on 6223  Progress: 1339 on 6223  Progress: 1340 on 6223  Progress: 1341 on 6223  Progress: 1342 on 6223  Progress: 1343 on 6223  Progress: 1344 on 6223  Progress: 1345 on 6223  Progress: 1346 on 6223  Progress: 1347 on 6223  Progress: 1348 on 6223  Progress: 1349 on 6223  Progress: 1350 on 6223  Progress: 1351 on 6223  Progress: 1352 on 6223  Progress: 1353 on 6223  Progress: 1354 on 6223  Progress: 1355 on 6223  Progress: 1356 on 6223  Progress: 1357 on 6223  Progress: 1358 on 6223  Progress: 1359 on 6223  Progress: 1360 on 6223  Progress: 1361 on 6223  Progress: 1362 on 6223  Progress: 1363 on 6223  Progress: 1364 on 6223  Progress: 1365 on 6223  Progress: 1366 on 6223  Progress: 1367 on 6223  Progress: 1368 on 6223  Progress: 1369 on 6223  Progress: 1370 on 6223  Progress: 1371 on 6223  Progress: 1372 on 6223  Progress: 1373 on 6223  Progress: 1374 on 6223  Progress: 1375 on 6223  Progress: 1376 on 6223  Progress: 1377 on 6223  Progress: 1378 on 6223  Progress: 1379 on 6223  Progress: 1380 on 6223  Progress: 1381 on 6223  Progress: 1382 on 6223  Progress: 1383 on 6223  Progress: 1384 on 6223  Progress: 1385 on 6223  Progress: 1386 on 6223  Progress: 1387 on 6223  Progress: 1388 on 6223  Progress: 1389 on 6223  Progress: 1390 on 6223  Progress: 1391 on 6223  Progress: 1392 on 6223  Progress: 1393 on 6223  Progress: 1394 on 6223  Progress: 1395 on 6223  Progress: 1396 on 6223  Progress: 1397 on 6223  Progress: 1398 on 6223  Progress: 1399 on 6223  Progress: 1400 on 6223  Progress: 1401 on 6223  Progress: 1402 on 6223  Progress: 1403 on 6223  Progress: 1404 on 6223  Progress: 1405 on 6223  Progress: 1406 on 6223  Progress: 1407 on 6223  Progress: 1408 on 6223  Progress: 1409 on 6223  Progress: 1410 on 6223  Progress: 1411 on 6223  Progress: 1412 on 6223  Progress: 1413 on 6223  Progress: 1414 on 6223  Progress: 1415 on 6223  Progress: 1416 on 6223  Progress: 1417 on 6223  Progress: 1418 on 6223  Progress: 1419 on 6223  Progress: 1420 on 6223  Progress: 1421 on 6223  Progress: 1422 on 6223  Progress: 1423 on 6223  Progress: 1424 on 6223  Progress: 1425 on 6223  Progress: 1426 on 6223  Progress: 1427 on 6223  Progress: 1428 on 6223  Progress: 1429 on 6223  Progress: 1430 on 6223  Progress: 1431 on 6223  Progress: 1432 on 6223  Progress: 1433 on 6223  Progress: 1434 on 6223  Progress: 1435 on 6223  Progress: 1436 on 6223  Progress: 1437 on 6223  Progress: 1438 on 6223  Progress: 1439 on 6223  Progress: 1440 on 6223  Progress: 1441 on 6223  Progress: 1442 on 6223  Progress: 1443 on 6223  Progress: 1444 on 6223  Progress: 1445 on 6223  Progress: 1446 on 6223  Progress: 1447 on 6223  Progress: 1448 on 6223  Progress: 1449 on 6223  Progress: 1450 on 6223  Progress: 1451 on 6223  Progress: 1452 on 6223  Progress: 1453 on 6223  Progress: 1454 on 6223  Progress: 1455 on 6223  Progress: 1456 on 6223  Progress: 1457 on 6223  Progress: 1458 on 6223  Progress: 1459 on 6223  Progress: 1460 on 6223  Progress: 1461 on 6223  Progress: 1462 on 6223  Progress: 1463 on 6223  Progress: 1464 on 6223  Progress: 1465 on 6223  Progress: 1466 on 6223  Progress: 1467 on 6223  Progress: 1468 on 6223  Progress: 1469 on 6223  Progress: 1470 on 6223  Progress: 1471 on 6223  Progress: 1472 on 6223  Progress: 1473 on 6223  Progress: 1474 on 6223  Progress: 1475 on 6223  Progress: 1476 on 6223  Progress: 1477 on 6223  Progress: 1478 on 6223  Progress: 1479 on 6223  Progress: 1480 on 6223  Progress: 1481 on 6223  Progress: 1482 on 6223  Progress: 1483 on 6223  Progress: 1484 on 6223  Progress: 1485 on 6223  Progress: 1486 on 6223  Progress: 1487 on 6223  Progress: 1488 on 6223  Progress: 1489 on 6223  Progress: 1490 on 6223  Progress: 1491 on 6223  Progress: 1492 on 6223  Progress: 1493 on 6223  Progress: 1494 on 6223  Progress: 1495 on 6223  Progress: 1496 on 6223  Progress: 1497 on 6223  Progress: 1498 on 6223  Progress: 1499 on 6223  Progress: 1500 on 6223  Progress: 1501 on 6223  Progress: 1502 on 6223  Progress: 1503 on 6223  Progress: 1504 on 6223  Progress: 1505 on 6223  Progress: 1506 on 6223  Progress: 1507 on 6223  Progress: 1508 on 6223  Progress: 1509 on 6223  Progress: 1510 on 6223  Progress: 1511 on 6223  Progress: 1512 on 6223  Progress: 1513 on 6223  Progress: 1514 on 6223  Progress: 1515 on 6223  Progress: 1516 on 6223  Progress: 1517 on 6223  Progress: 1518 on 6223  Progress: 1519 on 6223  Progress: 1520 on 6223  Progress: 1521 on 6223  Progress: 1522 on 6223  Progress: 1523 on 6223  Progress: 1524 on 6223  Progress: 1525 on 6223  Progress: 1526 on 6223  Progress: 1527 on 6223  Progress: 1528 on 6223  Progress: 1529 on 6223  Progress: 1530 on 6223  Progress: 1531 on 6223  Progress: 1532 on 6223  Progress: 1533 on 6223  Progress: 1534 on 6223  Progress: 1535 on 6223  Progress: 1536 on 6223  Progress: 1537 on 6223  Progress: 1538 on 6223  Progress: 1539 on 6223  Progress: 1540 on 6223  Progress: 1541 on 6223  Progress: 1542 on 6223  Progress: 1543 on 6223  Progress: 1544 on 6223  Progress: 1545 on 6223  Progress: 1546 on 6223  Progress: 1547 on 6223  Progress: 1548 on 6223  Progress: 1549 on 6223  Progress: 1550 on 6223  Progress: 1551 on 6223  Progress: 1552 on 6223  Progress: 1553 on 6223  Progress: 1554 on 6223  Progress: 1555 on 6223  Progress: 1556 on 6223  Progress: 1557 on 6223  Progress: 1558 on 6223  Progress: 1559 on 6223  Progress: 1560 on 6223  Progress: 1561 on 6223  Progress: 1562 on 6223  Progress: 1563 on 6223  Progress: 1564 on 6223  Progress: 1565 on 6223  Progress: 1566 on 6223  Progress: 1567 on 6223  Progress: 1568 on 6223  Progress: 1569 on 6223  Progress: 1570 on 6223  Progress: 1571 on 6223  Progress: 1572 on 6223  Progress: 1573 on 6223  Progress: 1574 on 6223  Progress: 1575 on 6223  Progress: 1576 on 6223  Progress: 1577 on 6223  Progress: 1578 on 6223  Progress: 1579 on 6223  Progress: 1580 on 6223  Progress: 1581 on 6223  Progress: 1582 on 6223  Progress: 1583 on 6223  Progress: 1584 on 6223  Progress: 1585 on 6223  Progress: 1586 on 6223  Progress: 1587 on 6223  Progress: 1588 on 6223  Progress: 1589 on 6223  Progress: 1590 on 6223  Progress: 1591 on 6223  Progress: 1592 on 6223  Progress: 1593 on 6223  Progress: 1594 on 6223  Progress: 1595 on 6223  Progress: 1596 on 6223  Progress: 1597 on 6223  Progress: 1598 on 6223  Progress: 1599 on 6223  Progress: 1600 on 6223  Progress: 1601 on 6223  Progress: 1602 on 6223  Progress: 1603 on 6223  Progress: 1604 on 6223  Progress: 1605 on 6223  Progress: 1606 on 6223  Progress: 1607 on 6223  Progress: 1608 on 6223  Progress: 1609 on 6223  Progress: 1610 on 6223  Progress: 1611 on 6223  Progress: 1612 on 6223  Progress: 1613 on 6223  Progress: 1614 on 6223  Progress: 1615 on 6223  Progress: 1616 on 6223  Progress: 1617 on 6223  Progress: 1618 on 6223  Progress: 1619 on 6223  Progress: 1620 on 6223  Progress: 1621 on 6223  Progress: 1622 on 6223  Progress: 1623 on 6223  Progress: 1624 on 6223  Progress: 1625 on 6223  Progress: 1626 on 6223  Progress: 1627 on 6223  Progress: 1628 on 6223  Progress: 1629 on 6223  Progress: 1630 on 6223  Progress: 1631 on 6223  Progress: 1632 on 6223  Progress: 1633 on 6223  Progress: 1634 on 6223  Progress: 1635 on 6223  Progress: 1636 on 6223  Progress: 1637 on 6223  Progress: 1638 on 6223  Progress: 1639 on 6223  Progress: 1640 on 6223  Progress: 1641 on 6223  Progress: 1642 on 6223  Progress: 1643 on 6223  Progress: 1644 on 6223  Progress: 1645 on 6223  Progress: 1646 on 6223  Progress: 1647 on 6223  Progress: 1648 on 6223  Progress: 1649 on 6223  Progress: 1650 on 6223  Progress: 1651 on 6223  Progress: 1652 on 6223  Progress: 1653 on 6223  Progress: 1654 on 6223  Progress: 1655 on 6223  Progress: 1656 on 6223  Progress: 1657 on 6223  Progress: 1658 on 6223  Progress: 1659 on 6223  Progress: 1660 on 6223  Progress: 1661 on 6223  Progress: 1662 on 6223  Progress: 1663 on 6223  Progress: 1664 on 6223  Progress: 1665 on 6223  Progress: 1666 on 6223  Progress: 1667 on 6223  Progress: 1668 on 6223  Progress: 1669 on 6223  Progress: 1670 on 6223  Progress: 1671 on 6223  Progress: 1672 on 6223  Progress: 1673 on 6223  Progress: 1674 on 6223  Progress: 1675 on 6223  Progress: 1676 on 6223  Progress: 1677 on 6223  Progress: 1678 on 6223  Progress: 1679 on 6223  Progress: 1680 on 6223  Progress: 1681 on 6223  Progress: 1682 on 6223  Progress: 1683 on 6223  Progress: 1684 on 6223  Progress: 1685 on 6223  Progress: 1686 on 6223  Progress: 1687 on 6223  Progress: 1688 on 6223  Progress: 1689 on 6223  Progress: 1690 on 6223  Progress: 1691 on 6223  Progress: 1692 on 6223  Progress: 1693 on 6223  Progress: 1694 on 6223  Progress: 1695 on 6223  Progress: 1696 on 6223  Progress: 1697 on 6223  Progress: 1698 on 6223  Progress: 1699 on 6223  Progress: 1700 on 6223  Progress: 1701 on 6223  Progress: 1702 on 6223  Progress: 1703 on 6223  Progress: 1704 on 6223  Progress: 1705 on 6223  Progress: 1706 on 6223  Progress: 1707 on 6223  Progress: 1708 on 6223  Progress: 1709 on 6223  Progress: 1710 on 6223  Progress: 1711 on 6223  Progress: 1712 on 6223  Progress: 1713 on 6223  Progress: 1714 on 6223  Progress: 1715 on 6223  Progress: 1716 on 6223  Progress: 1717 on 6223  Progress: 1718 on 6223  Progress: 1719 on 6223  Progress: 1720 on 6223  Progress: 1721 on 6223  Progress: 1722 on 6223  Progress: 1723 on 6223  Progress: 1724 on 6223  Progress: 1725 on 6223  Progress: 1726 on 6223  Progress: 1727 on 6223  Progress: 1728 on 6223  Progress: 1729 on 6223  Progress: 1730 on 6223  Progress: 1731 on 6223  Progress: 1732 on 6223  Progress: 1733 on 6223  Progress: 1734 on 6223  Progress: 1735 on 6223  Progress: 1736 on 6223  Progress: 1737 on 6223  Progress: 1738 on 6223  Progress: 1739 on 6223  Progress: 1740 on 6223  Progress: 1741 on 6223  Progress: 1742 on 6223  Progress: 1743 on 6223  Progress: 1744 on 6223  Progress: 1745 on 6223  Progress: 1746 on 6223  Progress: 1747 on 6223  Progress: 1748 on 6223  Progress: 1749 on 6223  Progress: 1750 on 6223  Progress: 1751 on 6223  Progress: 1752 on 6223  Progress: 1753 on 6223  Progress: 1754 on 6223  Progress: 1755 on 6223  Progress: 1756 on 6223  Progress: 1757 on 6223  Progress: 1758 on 6223  Progress: 1759 on 6223  Progress: 1760 on 6223  Progress: 1761 on 6223  Progress: 1762 on 6223  Progress: 1763 on 6223  Progress: 1764 on 6223  Progress: 1765 on 6223  Progress: 1766 on 6223  Progress: 1767 on 6223  Progress: 1768 on 6223  Progress: 1769 on 6223  Progress: 1770 on 6223  Progress: 1771 on 6223  Progress: 1772 on 6223  Progress: 1773 on 6223  Progress: 1774 on 6223  Progress: 1775 on 6223  Progress: 1776 on 6223  Progress: 1777 on 6223  Progress: 1778 on 6223  Progress: 1779 on 6223  Progress: 1780 on 6223  Progress: 1781 on 6223  Progress: 1782 on 6223  Progress: 1783 on 6223  Progress: 1784 on 6223  Progress: 1785 on 6223  Progress: 1786 on 6223  Progress: 1787 on 6223  Progress: 1788 on 6223  Progress: 1789 on 6223  Progress: 1790 on 6223  Progress: 1791 on 6223  Progress: 1792 on 6223  Progress: 1793 on 6223  Progress: 1794 on 6223  Progress: 1795 on 6223  Progress: 1796 on 6223  Progress: 1797 on 6223  Progress: 1798 on 6223  Progress: 1799 on 6223  Progress: 1800 on 6223  Progress: 1801 on 6223  Progress: 1802 on 6223  Progress: 1803 on 6223  Progress: 1804 on 6223  Progress: 1805 on 6223  Progress: 1806 on 6223  Progress: 1807 on 6223  Progress: 1808 on 6223  Progress: 1809 on 6223  Progress: 1810 on 6223  Progress: 1811 on 6223  Progress: 1812 on 6223  Progress: 1813 on 6223  Progress: 1814 on 6223  Progress: 1815 on 6223  Progress: 1816 on 6223  Progress: 1817 on 6223  Progress: 1818 on 6223  Progress: 1819 on 6223  Progress: 1820 on 6223  Progress: 1821 on 6223  Progress: 1822 on 6223  Progress: 1823 on 6223  Progress: 1824 on 6223  Progress: 1825 on 6223  Progress: 1826 on 6223  Progress: 1827 on 6223  Progress: 1828 on 6223  Progress: 1829 on 6223  Progress: 1830 on 6223  Progress: 1831 on 6223  Progress: 1832 on 6223  Progress: 1833 on 6223  Progress: 1834 on 6223  Progress: 1835 on 6223  Progress: 1836 on 6223  Progress: 1837 on 6223  Progress: 1838 on 6223  Progress: 1839 on 6223  Progress: 1840 on 6223  Progress: 1841 on 6223  Progress: 1842 on 6223  Progress: 1843 on 6223  Progress: 1844 on 6223  Progress: 1845 on 6223  Progress: 1846 on 6223  Progress: 1847 on 6223  Progress: 1848 on 6223  Progress: 1849 on 6223  Progress: 1850 on 6223  Progress: 1851 on 6223  Progress: 1852 on 6223  Progress: 1853 on 6223  Progress: 1854 on 6223  Progress: 1855 on 6223  Progress: 1856 on 6223  Progress: 1857 on 6223  Progress: 1858 on 6223  Progress: 1859 on 6223  Progress: 1860 on 6223  Progress: 1861 on 6223  Progress: 1862 on 6223  Progress: 1863 on 6223  Progress: 1864 on 6223  Progress: 1865 on 6223  Progress: 1866 on 6223  Progress: 1867 on 6223  Progress: 1868 on 6223  Progress: 1869 on 6223  Progress: 1870 on 6223  Progress: 1871 on 6223  Progress: 1872 on 6223  Progress: 1873 on 6223  Progress: 1874 on 6223  Progress: 1875 on 6223  Progress: 1876 on 6223  Progress: 1877 on 6223  Progress: 1878 on 6223  Progress: 1879 on 6223  Progress: 1880 on 6223  Progress: 1881 on 6223  Progress: 1882 on 6223  Progress: 1883 on 6223  Progress: 1884 on 6223  Progress: 1885 on 6223  Progress: 1886 on 6223  Progress: 1887 on 6223  Progress: 1888 on 6223  Progress: 1889 on 6223  Progress: 1890 on 6223  Progress: 1891 on 6223  Progress: 1892 on 6223  Progress: 1893 on 6223  Progress: 1894 on 6223  Progress: 1895 on 6223  Progress: 1896 on 6223  Progress: 1897 on 6223  Progress: 1898 on 6223  Progress: 1899 on 6223  Progress: 1900 on 6223  Progress: 1901 on 6223  Progress: 1902 on 6223  Progress: 1903 on 6223  Progress: 1904 on 6223  Progress: 1905 on 6223  Progress: 1906 on 6223  Progress: 1907 on 6223  Progress: 1908 on 6223  Progress: 1909 on 6223  Progress: 1910 on 6223  Progress: 1911 on 6223  Progress: 1912 on 6223  Progress: 1913 on 6223  Progress: 1914 on 6223  Progress: 1915 on 6223  Progress: 1916 on 6223  Progress: 1917 on 6223  Progress: 1918 on 6223  Progress: 1919 on 6223  Progress: 1920 on 6223  Progress: 1921 on 6223  Progress: 1922 on 6223  Progress: 1923 on 6223  Progress: 1924 on 6223  Progress: 1925 on 6223  Progress: 1926 on 6223  Progress: 1927 on 6223  Progress: 1928 on 6223  Progress: 1929 on 6223  Progress: 1930 on 6223  Progress: 1931 on 6223  Progress: 1932 on 6223  Progress: 1933 on 6223  Progress: 1934 on 6223  Progress: 1935 on 6223  Progress: 1936 on 6223  Progress: 1937 on 6223  Progress: 1938 on 6223  Progress: 1939 on 6223  Progress: 1940 on 6223  Progress: 1941 on 6223  Progress: 1942 on 6223  Progress: 1943 on 6223  Progress: 1944 on 6223  Progress: 1945 on 6223  Progress: 1946 on 6223  Progress: 1947 on 6223  Progress: 1948 on 6223  Progress: 1949 on 6223  Progress: 1950 on 6223  Progress: 1951 on 6223  Progress: 1952 on 6223  Progress: 1953 on 6223  Progress: 1954 on 6223  Progress: 1955 on 6223  Progress: 1956 on 6223  Progress: 1957 on 6223  Progress: 1958 on 6223  Progress: 1959 on 6223  Progress: 1960 on 6223  Progress: 1961 on 6223  Progress: 1962 on 6223  Progress: 1963 on 6223  Progress: 1964 on 6223  Progress: 1965 on 6223  Progress: 1966 on 6223  Progress: 1967 on 6223  Progress: 1968 on 6223  Progress: 1969 on 6223  Progress: 1970 on 6223  Progress: 1971 on 6223  Progress: 1972 on 6223  Progress: 1973 on 6223  Progress: 1974 on 6223  Progress: 1975 on 6223  Progress: 1976 on 6223  Progress: 1977 on 6223  Progress: 1978 on 6223  Progress: 1979 on 6223  Progress: 1980 on 6223  Progress: 1981 on 6223  Progress: 1982 on 6223  Progress: 1983 on 6223  Progress: 1984 on 6223  Progress: 1985 on 6223  Progress: 1986 on 6223  Progress: 1987 on 6223  Progress: 1988 on 6223  Progress: 1989 on 6223  Progress: 1990 on 6223  Progress: 1991 on 6223  Progress: 1992 on 6223  Progress: 1993 on 6223  Progress: 1994 on 6223  Progress: 1995 on 6223  Progress: 1996 on 6223  Progress: 1997 on 6223  Progress: 1998 on 6223  Progress: 1999 on 6223  Progress: 2000 on 6223  Progress: 2001 on 6223  Progress: 2002 on 6223  Progress: 2003 on 6223  Progress: 2004 on 6223  Progress: 2005 on 6223  Progress: 2006 on 6223  Progress: 2007 on 6223  Progress: 2008 on 6223  Progress: 2009 on 6223  Progress: 2010 on 6223  Progress: 2011 on 6223  Progress: 2012 on 6223  Progress: 2013 on 6223  Progress: 2014 on 6223  Progress: 2015 on 6223  Progress: 2016 on 6223  Progress: 2017 on 6223  Progress: 2018 on 6223  Progress: 2019 on 6223  Progress: 2020 on 6223  Progress: 2021 on 6223  Progress: 2022 on 6223  Progress: 2023 on 6223  Progress: 2024 on 6223  Progress: 2025 on 6223  Progress: 2026 on 6223  Progress: 2027 on 6223  Progress: 2028 on 6223  Progress: 2029 on 6223  Progress: 2030 on 6223  Progress: 2031 on 6223  Progress: 2032 on 6223  Progress: 2033 on 6223  Progress: 2034 on 6223  Progress: 2035 on 6223  Progress: 2036 on 6223  Progress: 2037 on 6223  Progress: 2038 on 6223  Progress: 2039 on 6223  Progress: 2040 on 6223  Progress: 2041 on 6223  Progress: 2042 on 6223  Progress: 2043 on 6223  Progress: 2044 on 6223  Progress: 2045 on 6223  Progress: 2046 on 6223  Progress: 2047 on 6223  Progress: 2048 on 6223  Progress: 2049 on 6223  Progress: 2050 on 6223  Progress: 2051 on 6223  Progress: 2052 on 6223  Progress: 2053 on 6223  Progress: 2054 on 6223  Progress: 2055 on 6223  Progress: 2056 on 6223  Progress: 2057 on 6223  Progress: 2058 on 6223  Progress: 2059 on 6223  Progress: 2060 on 6223  Progress: 2061 on 6223  Progress: 2062 on 6223  Progress: 2063 on 6223  Progress: 2064 on 6223  Progress: 2065 on 6223  Progress: 2066 on 6223  Progress: 2067 on 6223  Progress: 2068 on 6223  Progress: 2069 on 6223  Progress: 2070 on 6223  Progress: 2071 on 6223  Progress: 2072 on 6223  Progress: 2073 on 6223  Progress: 2074 on 6223  Progress: 2075 on 6223  Progress: 2076 on 6223  Progress: 2077 on 6223  Progress: 2078 on 6223  Progress: 2079 on 6223  Progress: 2080 on 6223  Progress: 2081 on 6223  Progress: 2082 on 6223  Progress: 2083 on 6223  Progress: 2084 on 6223  Progress: 2085 on 6223  Progress: 2086 on 6223  Progress: 2087 on 6223  Progress: 2088 on 6223  Progress: 2089 on 6223  Progress: 2090 on 6223  Progress: 2091 on 6223  Progress: 2092 on 6223  Progress: 2093 on 6223  Progress: 2094 on 6223  Progress: 2095 on 6223  Progress: 2096 on 6223  Progress: 2097 on 6223  Progress: 2098 on 6223  Progress: 2099 on 6223  Progress: 2100 on 6223  Progress: 2101 on 6223  Progress: 2102 on 6223  Progress: 2103 on 6223  Progress: 2104 on 6223  Progress: 2105 on 6223  Progress: 2106 on 6223  Progress: 2107 on 6223  Progress: 2108 on 6223  Progress: 2109 on 6223  Progress: 2110 on 6223  Progress: 2111 on 6223  Progress: 2112 on 6223  Progress: 2113 on 6223  Progress: 2114 on 6223  Progress: 2115 on 6223  Progress: 2116 on 6223  Progress: 2117 on 6223  Progress: 2118 on 6223  Progress: 2119 on 6223  Progress: 2120 on 6223  Progress: 2121 on 6223  Progress: 2122 on 6223  Progress: 2123 on 6223  Progress: 2124 on 6223  Progress: 2125 on 6223  Progress: 2126 on 6223  Progress: 2127 on 6223  Progress: 2128 on 6223  Progress: 2129 on 6223  Progress: 2130 on 6223  Progress: 2131 on 6223  Progress: 2132 on 6223  Progress: 2133 on 6223  Progress: 2134 on 6223  Progress: 2135 on 6223  Progress: 2136 on 6223  Progress: 2137 on 6223  Progress: 2138 on 6223  Progress: 2139 on 6223  Progress: 2140 on 6223  Progress: 2141 on 6223  Progress: 2142 on 6223  Progress: 2143 on 6223  Progress: 2144 on 6223  Progress: 2145 on 6223  Progress: 2146 on 6223  Progress: 2147 on 6223  Progress: 2148 on 6223  Progress: 2149 on 6223  Progress: 2150 on 6223  Progress: 2151 on 6223  Progress: 2152 on 6223  Progress: 2153 on 6223  Progress: 2154 on 6223  Progress: 2155 on 6223  Progress: 2156 on 6223  Progress: 2157 on 6223  Progress: 2158 on 6223  Progress: 2159 on 6223  Progress: 2160 on 6223  Progress: 2161 on 6223  Progress: 2162 on 6223  Progress: 2163 on 6223  Progress: 2164 on 6223  Progress: 2165 on 6223  Progress: 2166 on 6223  Progress: 2167 on 6223  Progress: 2168 on 6223  Progress: 2169 on 6223  Progress: 2170 on 6223  Progress: 2171 on 6223  Progress: 2172 on 6223  Progress: 2173 on 6223  Progress: 2174 on 6223  Progress: 2175 on 6223  Progress: 2176 on 6223  Progress: 2177 on 6223  Progress: 2178 on 6223  Progress: 2179 on 6223  Progress: 2180 on 6223  Progress: 2181 on 6223  Progress: 2182 on 6223  Progress: 2183 on 6223  Progress: 2184 on 6223  Progress: 2185 on 6223  Progress: 2186 on 6223  Progress: 2187 on 6223  Progress: 2188 on 6223  Progress: 2189 on 6223  Progress: 2190 on 6223  Progress: 2191 on 6223  Progress: 2192 on 6223  Progress: 2193 on 6223  Progress: 2194 on 6223  Progress: 2195 on 6223  Progress: 2196 on 6223  Progress: 2197 on 6223  Progress: 2198 on 6223  Progress: 2199 on 6223  Progress: 2200 on 6223  Progress: 2201 on 6223  Progress: 2202 on 6223  Progress: 2203 on 6223  Progress: 2204 on 6223  Progress: 2205 on 6223  Progress: 2206 on 6223  Progress: 2207 on 6223  Progress: 2208 on 6223  Progress: 2209 on 6223  Progress: 2210 on 6223  Progress: 2211 on 6223  Progress: 2212 on 6223  Progress: 2213 on 6223  Progress: 2214 on 6223  Progress: 2215 on 6223  Progress: 2216 on 6223  Progress: 2217 on 6223  Progress: 2218 on 6223  Progress: 2219 on 6223  Progress: 2220 on 6223  Progress: 2221 on 6223  Progress: 2222 on 6223  Progress: 2223 on 6223  Progress: 2224 on 6223  Progress: 2225 on 6223  Progress: 2226 on 6223  Progress: 2227 on 6223  Progress: 2228 on 6223  Progress: 2229 on 6223  Progress: 2230 on 6223  Progress: 2231 on 6223  Progress: 2232 on 6223  Progress: 2233 on 6223  Progress: 2234 on 6223  Progress: 2235 on 6223  Progress: 2236 on 6223  Progress: 2237 on 6223  Progress: 2238 on 6223  Progress: 2239 on 6223  Progress: 2240 on 6223  Progress: 2241 on 6223  Progress: 2242 on 6223  Progress: 2243 on 6223  Progress: 2244 on 6223  Progress: 2245 on 6223  Progress: 2246 on 6223  Progress: 2247 on 6223  Progress: 2248 on 6223  Progress: 2249 on 6223  Progress: 2250 on 6223  Progress: 2251 on 6223  Progress: 2252 on 6223  Progress: 2253 on 6223  Progress: 2254 on 6223  Progress: 2255 on 6223  Progress: 2256 on 6223  Progress: 2257 on 6223  Progress: 2258 on 6223  Progress: 2259 on 6223  Progress: 2260 on 6223  Progress: 2261 on 6223  Progress: 2262 on 6223  Progress: 2263 on 6223  Progress: 2264 on 6223  Progress: 2265 on 6223  Progress: 2266 on 6223  Progress: 2267 on 6223  Progress: 2268 on 6223  Progress: 2269 on 6223  Progress: 2270 on 6223  Progress: 2271 on 6223  Progress: 2272 on 6223  Progress: 2273 on 6223  Progress: 2274 on 6223  Progress: 2275 on 6223  Progress: 2276 on 6223  Progress: 2277 on 6223  Progress: 2278 on 6223  Progress: 2279 on 6223  Progress: 2280 on 6223  Progress: 2281 on 6223  Progress: 2282 on 6223  Progress: 2283 on 6223  Progress: 2284 on 6223  Progress: 2285 on 6223  Progress: 2286 on 6223  Progress: 2287 on 6223  Progress: 2288 on 6223  Progress: 2289 on 6223  Progress: 2290 on 6223  Progress: 2291 on 6223  Progress: 2292 on 6223  Progress: 2293 on 6223  Progress: 2294 on 6223  Progress: 2295 on 6223  Progress: 2296 on 6223  Progress: 2297 on 6223  Progress: 2298 on 6223  Progress: 2299 on 6223  Progress: 2300 on 6223  Progress: 2301 on 6223  Progress: 2302 on 6223  Progress: 2303 on 6223  Progress: 2304 on 6223  Progress: 2305 on 6223  Progress: 2306 on 6223  Progress: 2307 on 6223  Progress: 2308 on 6223  Progress: 2309 on 6223  Progress: 2310 on 6223  Progress: 2311 on 6223  Progress: 2312 on 6223  Progress: 2313 on 6223  Progress: 2314 on 6223  Progress: 2315 on 6223  Progress: 2316 on 6223  Progress: 2317 on 6223  Progress: 2318 on 6223  Progress: 2319 on 6223  Progress: 2320 on 6223  Progress: 2321 on 6223  Progress: 2322 on 6223  Progress: 2323 on 6223  Progress: 2324 on 6223  Progress: 2325 on 6223  Progress: 2326 on 6223  Progress: 2327 on 6223  Progress: 2328 on 6223  Progress: 2329 on 6223  Progress: 2330 on 6223  Progress: 2331 on 6223  Progress: 2332 on 6223  Progress: 2333 on 6223  Progress: 2334 on 6223  Progress: 2335 on 6223  Progress: 2336 on 6223  Progress: 2337 on 6223  Progress: 2338 on 6223  Progress: 2339 on 6223  Progress: 2340 on 6223  Progress: 2341 on 6223  Progress: 2342 on 6223  Progress: 2343 on 6223  Progress: 2344 on 6223  Progress: 2345 on 6223  Progress: 2346 on 6223  Progress: 2347 on 6223  Progress: 2348 on 6223  Progress: 2349 on 6223  Progress: 2350 on 6223  Progress: 2351 on 6223  Progress: 2352 on 6223  Progress: 2353 on 6223  Progress: 2354 on 6223  Progress: 2355 on 6223  Progress: 2356 on 6223  Progress: 2357 on 6223  Progress: 2358 on 6223  Progress: 2359 on 6223  Progress: 2360 on 6223  Progress: 2361 on 6223  Progress: 2362 on 6223  Progress: 2363 on 6223  Progress: 2364 on 6223  Progress: 2365 on 6223  Progress: 2366 on 6223  Progress: 2367 on 6223  Progress: 2368 on 6223  Progress: 2369 on 6223  Progress: 2370 on 6223  Progress: 2371 on 6223  Progress: 2372 on 6223  Progress: 2373 on 6223  Progress: 2374 on 6223  Progress: 2375 on 6223  Progress: 2376 on 6223  Progress: 2377 on 6223  Progress: 2378 on 6223  Progress: 2379 on 6223  Progress: 2380 on 6223  Progress: 2381 on 6223  Progress: 2382 on 6223  Progress: 2383 on 6223  Progress: 2384 on 6223  Progress: 2385 on 6223  Progress: 2386 on 6223  Progress: 2387 on 6223  Progress: 2388 on 6223  Progress: 2389 on 6223  Progress: 2390 on 6223  Progress: 2391 on 6223  Progress: 2392 on 6223  Progress: 2393 on 6223  Progress: 2394 on 6223  Progress: 2395 on 6223  Progress: 2396 on 6223  Progress: 2397 on 6223  Progress: 2398 on 6223  Progress: 2399 on 6223  Progress: 2400 on 6223  Progress: 2401 on 6223  Progress: 2402 on 6223  Progress: 2403 on 6223  Progress: 2404 on 6223  Progress: 2405 on 6223  Progress: 2406 on 6223  Progress: 2407 on 6223  Progress: 2408 on 6223  Progress: 2409 on 6223  Progress: 2410 on 6223  Progress: 2411 on 6223  Progress: 2412 on 6223  Progress: 2413 on 6223  Progress: 2414 on 6223  Progress: 2415 on 6223  Progress: 2416 on 6223  Progress: 2417 on 6223  Progress: 2418 on 6223  Progress: 2419 on 6223  Progress: 2420 on 6223  Progress: 2421 on 6223  Progress: 2422 on 6223  Progress: 2423 on 6223  Progress: 2424 on 6223  Progress: 2425 on 6223  Progress: 2426 on 6223  Progress: 2427 on 6223  Progress: 2428 on 6223  Progress: 2429 on 6223  Progress: 2430 on 6223  Progress: 2431 on 6223  Progress: 2432 on 6223  Progress: 2433 on 6223  Progress: 2434 on 6223  Progress: 2435 on 6223  Progress: 2436 on 6223  Progress: 2437 on 6223  Progress: 2438 on 6223  Progress: 2439 on 6223  Progress: 2440 on 6223  Progress: 2441 on 6223  Progress: 2442 on 6223  Progress: 2443 on 6223  Progress: 2444 on 6223  Progress: 2445 on 6223  Progress: 2446 on 6223  Progress: 2447 on 6223  Progress: 2448 on 6223  Progress: 2449 on 6223  Progress: 2450 on 6223  Progress: 2451 on 6223  Progress: 2452 on 6223  Progress: 2453 on 6223  Progress: 2454 on 6223  Progress: 2455 on 6223  Progress: 2456 on 6223  Progress: 2457 on 6223  Progress: 2458 on 6223  Progress: 2459 on 6223  Progress: 2460 on 6223  Progress: 2461 on 6223  Progress: 2462 on 6223  Progress: 2463 on 6223  Progress: 2464 on 6223  Progress: 2465 on 6223  Progress: 2466 on 6223  Progress: 2467 on 6223  Progress: 2468 on 6223  Progress: 2469 on 6223  Progress: 2470 on 6223  Progress: 2471 on 6223  Progress: 2472 on 6223  Progress: 2473 on 6223  Progress: 2474 on 6223  Progress: 2475 on 6223  Progress: 2476 on 6223  Progress: 2477 on 6223  Progress: 2478 on 6223  Progress: 2479 on 6223  Progress: 2480 on 6223  Progress: 2481 on 6223  Progress: 2482 on 6223  Progress: 2483 on 6223  Progress: 2484 on 6223  Progress: 2485 on 6223  Progress: 2486 on 6223  Progress: 2487 on 6223  Progress: 2488 on 6223  Progress: 2489 on 6223  Progress: 2490 on 6223  Progress: 2491 on 6223  Progress: 2492 on 6223  Progress: 2493 on 6223  Progress: 2494 on 6223  Progress: 2495 on 6223  Progress: 2496 on 6223  Progress: 2497 on 6223  Progress: 2498 on 6223  Progress: 2499 on 6223  Progress: 2500 on 6223  Progress: 2501 on 6223  Progress: 2502 on 6223  Progress: 2503 on 6223  Progress: 2504 on 6223  Progress: 2505 on 6223  Progress: 2506 on 6223  Progress: 2507 on 6223  Progress: 2508 on 6223  Progress: 2509 on 6223  Progress: 2510 on 6223  Progress: 2511 on 6223  Progress: 2512 on 6223  Progress: 2513 on 6223  Progress: 2514 on 6223  Progress: 2515 on 6223  Progress: 2516 on 6223  Progress: 2517 on 6223  Progress: 2518 on 6223  Progress: 2519 on 6223  Progress: 2520 on 6223  Progress: 2521 on 6223  Progress: 2522 on 6223  Progress: 2523 on 6223  Progress: 2524 on 6223  Progress: 2525 on 6223  Progress: 2526 on 6223  Progress: 2527 on 6223  Progress: 2528 on 6223  Progress: 2529 on 6223  Progress: 2530 on 6223  Progress: 2531 on 6223  Progress: 2532 on 6223  Progress: 2533 on 6223  Progress: 2534 on 6223  Progress: 2535 on 6223  Progress: 2536 on 6223  Progress: 2537 on 6223  Progress: 2538 on 6223  Progress: 2539 on 6223  Progress: 2540 on 6223  Progress: 2541 on 6223  Progress: 2542 on 6223  Progress: 2543 on 6223  Progress: 2544 on 6223  Progress: 2545 on 6223  Progress: 2546 on 6223  Progress: 2547 on 6223  Progress: 2548 on 6223  Progress: 2549 on 6223  Progress: 2550 on 6223  Progress: 2551 on 6223  Progress: 2552 on 6223  Progress: 2553 on 6223  Progress: 2554 on 6223  Progress: 2555 on 6223  Progress: 2556 on 6223  Progress: 2557 on 6223  Progress: 2558 on 6223  Progress: 2559 on 6223  Progress: 2560 on 6223  Progress: 2561 on 6223  Progress: 2562 on 6223  Progress: 2563 on 6223  Progress: 2564 on 6223  Progress: 2565 on 6223  Progress: 2566 on 6223  Progress: 2567 on 6223  Progress: 2568 on 6223  Progress: 2569 on 6223  Progress: 2570 on 6223  Progress: 2571 on 6223  Progress: 2572 on 6223  Progress: 2573 on 6223  Progress: 2574 on 6223  Progress: 2575 on 6223  Progress: 2576 on 6223  Progress: 2577 on 6223  Progress: 2578 on 6223  Progress: 2579 on 6223  Progress: 2580 on 6223  Progress: 2581 on 6223  Progress: 2582 on 6223  Progress: 2583 on 6223  Progress: 2584 on 6223  Progress: 2585 on 6223  Progress: 2586 on 6223  Progress: 2587 on 6223  Progress: 2588 on 6223  Progress: 2589 on 6223  Progress: 2590 on 6223  Progress: 2591 on 6223  Progress: 2592 on 6223  Progress: 2593 on 6223  Progress: 2594 on 6223  Progress: 2595 on 6223  Progress: 2596 on 6223  Progress: 2597 on 6223  Progress: 2598 on 6223  Progress: 2599 on 6223  Progress: 2600 on 6223  Progress: 2601 on 6223  Progress: 2602 on 6223  Progress: 2603 on 6223  Progress: 2604 on 6223  Progress: 2605 on 6223  Progress: 2606 on 6223  Progress: 2607 on 6223  Progress: 2608 on 6223  Progress: 2609 on 6223  Progress: 2610 on 6223  Progress: 2611 on 6223  Progress: 2612 on 6223  Progress: 2613 on 6223  Progress: 2614 on 6223  Progress: 2615 on 6223  Progress: 2616 on 6223  Progress: 2617 on 6223  Progress: 2618 on 6223  Progress: 2619 on 6223  Progress: 2620 on 6223  Progress: 2621 on 6223  Progress: 2622 on 6223  Progress: 2623 on 6223  Progress: 2624 on 6223  Progress: 2625 on 6223  Progress: 2626 on 6223  Progress: 2627 on 6223  Progress: 2628 on 6223  Progress: 2629 on 6223  Progress: 2630 on 6223  Progress: 2631 on 6223  Progress: 2632 on 6223  Progress: 2633 on 6223  Progress: 2634 on 6223  Progress: 2635 on 6223  Progress: 2636 on 6223  Progress: 2637 on 6223  Progress: 2638 on 6223  Progress: 2639 on 6223  Progress: 2640 on 6223  Progress: 2641 on 6223  Progress: 2642 on 6223  Progress: 2643 on 6223  Progress: 2644 on 6223  Progress: 2645 on 6223  Progress: 2646 on 6223  Progress: 2647 on 6223  Progress: 2648 on 6223  Progress: 2649 on 6223  Progress: 2650 on 6223  Progress: 2651 on 6223  Progress: 2652 on 6223  Progress: 2653 on 6223  Progress: 2654 on 6223  Progress: 2655 on 6223  Progress: 2656 on 6223  Progress: 2657 on 6223  Progress: 2658 on 6223  Progress: 2659 on 6223  Progress: 2660 on 6223  Progress: 2661 on 6223  Progress: 2662 on 6223  Progress: 2663 on 6223  Progress: 2664 on 6223  Progress: 2665 on 6223  Progress: 2666 on 6223  Progress: 2667 on 6223  Progress: 2668 on 6223  Progress: 2669 on 6223  Progress: 2670 on 6223  Progress: 2671 on 6223  Progress: 2672 on 6223  Progress: 2673 on 6223  Progress: 2674 on 6223  Progress: 2675 on 6223  Progress: 2676 on 6223  Progress: 2677 on 6223  Progress: 2678 on 6223  Progress: 2679 on 6223  Progress: 2680 on 6223  Progress: 2681 on 6223  Progress: 2682 on 6223  Progress: 2683 on 6223  Progress: 2684 on 6223  Progress: 2685 on 6223  Progress: 2686 on 6223  Progress: 2687 on 6223  Progress: 2688 on 6223  Progress: 2689 on 6223  Progress: 2690 on 6223  Progress: 2691 on 6223  Progress: 2692 on 6223  Progress: 2693 on 6223  Progress: 2694 on 6223  Progress: 2695 on 6223  Progress: 2696 on 6223  Progress: 2697 on 6223  Progress: 2698 on 6223  Progress: 2699 on 6223  Progress: 2700 on 6223  Progress: 2701 on 6223  Progress: 2702 on 6223  Progress: 2703 on 6223  Progress: 2704 on 6223  Progress: 2705 on 6223  Progress: 2706 on 6223  Progress: 2707 on 6223  Progress: 2708 on 6223  Progress: 2709 on 6223  Progress: 2710 on 6223  Progress: 2711 on 6223  Progress: 2712 on 6223  Progress: 2713 on 6223  Progress: 2714 on 6223  Progress: 2715 on 6223  Progress: 2716 on 6223  Progress: 2717 on 6223  Progress: 2718 on 6223  Progress: 2719 on 6223  Progress: 2720 on 6223  Progress: 2721 on 6223  Progress: 2722 on 6223  Progress: 2723 on 6223  Progress: 2724 on 6223  Progress: 2725 on 6223  Progress: 2726 on 6223  Progress: 2727 on 6223  Progress: 2728 on 6223  Progress: 2729 on 6223  Progress: 2730 on 6223  Progress: 2731 on 6223  Progress: 2732 on 6223  Progress: 2733 on 6223  Progress: 2734 on 6223  Progress: 2735 on 6223  Progress: 2736 on 6223  Progress: 2737 on 6223  Progress: 2738 on 6223  Progress: 2739 on 6223  Progress: 2740 on 6223  Progress: 2741 on 6223  Progress: 2742 on 6223  Progress: 2743 on 6223  Progress: 2744 on 6223  Progress: 2745 on 6223  Progress: 2746 on 6223  Progress: 2747 on 6223  Progress: 2748 on 6223  Progress: 2749 on 6223  Progress: 2750 on 6223  Progress: 2751 on 6223  Progress: 2752 on 6223  Progress: 2753 on 6223  Progress: 2754 on 6223  Progress: 2755 on 6223  Progress: 2756 on 6223  Progress: 2757 on 6223  Progress: 2758 on 6223  Progress: 2759 on 6223  Progress: 2760 on 6223  Progress: 2761 on 6223  Progress: 2762 on 6223  Progress: 2763 on 6223  Progress: 2764 on 6223  Progress: 2765 on 6223  Progress: 2766 on 6223  Progress: 2767 on 6223  Progress: 2768 on 6223  Progress: 2769 on 6223  Progress: 2770 on 6223  Progress: 2771 on 6223  Progress: 2772 on 6223  Progress: 2773 on 6223  Progress: 2774 on 6223  Progress: 2775 on 6223  Progress: 2776 on 6223  Progress: 2777 on 6223  Progress: 2778 on 6223  Progress: 2779 on 6223  Progress: 2780 on 6223  Progress: 2781 on 6223  Progress: 2782 on 6223  Progress: 2783 on 6223  Progress: 2784 on 6223  Progress: 2785 on 6223  Progress: 2786 on 6223  Progress: 2787 on 6223  Progress: 2788 on 6223  Progress: 2789 on 6223  Progress: 2790 on 6223  Progress: 2791 on 6223  Progress: 2792 on 6223  Progress: 2793 on 6223  Progress: 2794 on 6223  Progress: 2795 on 6223  Progress: 2796 on 6223  Progress: 2797 on 6223  Progress: 2798 on 6223  Progress: 2799 on 6223  Progress: 2800 on 6223  Progress: 2801 on 6223  Progress: 2802 on 6223  Progress: 2803 on 6223  Progress: 2804 on 6223  Progress: 2805 on 6223  Progress: 2806 on 6223  Progress: 2807 on 6223  Progress: 2808 on 6223  Progress: 2809 on 6223  Progress: 2810 on 6223  Progress: 2811 on 6223  Progress: 2812 on 6223  Progress: 2813 on 6223  Progress: 2814 on 6223  Progress: 2815 on 6223  Progress: 2816 on 6223  Progress: 2817 on 6223  Progress: 2818 on 6223  Progress: 2819 on 6223  Progress: 2820 on 6223  Progress: 2821 on 6223  Progress: 2822 on 6223  Progress: 2823 on 6223  Progress: 2824 on 6223  Progress: 2825 on 6223  Progress: 2826 on 6223  Progress: 2827 on 6223  Progress: 2828 on 6223  Progress: 2829 on 6223  Progress: 2830 on 6223  Progress: 2831 on 6223  Progress: 2832 on 6223  Progress: 2833 on 6223  Progress: 2834 on 6223  Progress: 2835 on 6223  Progress: 2836 on 6223  Progress: 2837 on 6223  Progress: 2838 on 6223  Progress: 2839 on 6223  Progress: 2840 on 6223  Progress: 2841 on 6223  Progress: 2842 on 6223  Progress: 2843 on 6223  Progress: 2844 on 6223  Progress: 2845 on 6223  Progress: 2846 on 6223  Progress: 2847 on 6223  Progress: 2848 on 6223  Progress: 2849 on 6223  Progress: 2850 on 6223  Progress: 2851 on 6223  Progress: 2852 on 6223  Progress: 2853 on 6223  Progress: 2854 on 6223  Progress: 2855 on 6223  Progress: 2856 on 6223  Progress: 2857 on 6223  Progress: 2858 on 6223  Progress: 2859 on 6223  Progress: 2860 on 6223  Progress: 2861 on 6223  Progress: 2862 on 6223  Progress: 2863 on 6223  Progress: 2864 on 6223  Progress: 2865 on 6223  Progress: 2866 on 6223  Progress: 2867 on 6223  Progress: 2868 on 6223  Progress: 2869 on 6223  Progress: 2870 on 6223  Progress: 2871 on 6223  Progress: 2872 on 6223  Progress: 2873 on 6223  Progress: 2874 on 6223  Progress: 2875 on 6223  Progress: 2876 on 6223  Progress: 2877 on 6223  Progress: 2878 on 6223  Progress: 2879 on 6223  Progress: 2880 on 6223  Progress: 2881 on 6223  Progress: 2882 on 6223  Progress: 2883 on 6223  Progress: 2884 on 6223  Progress: 2885 on 6223  Progress: 2886 on 6223  Progress: 2887 on 6223  Progress: 2888 on 6223  Progress: 2889 on 6223  Progress: 2890 on 6223  Progress: 2891 on 6223  Progress: 2892 on 6223  Progress: 2893 on 6223  Progress: 2894 on 6223  Progress: 2895 on 6223  Progress: 2896 on 6223  Progress: 2897 on 6223  Progress: 2898 on 6223  Progress: 2899 on 6223  Progress: 2900 on 6223  Progress: 2901 on 6223  Progress: 2902 on 6223  Progress: 2903 on 6223  Progress: 2904 on 6223  Progress: 2905 on 6223  Progress: 2906 on 6223  Progress: 2907 on 6223  Progress: 2908 on 6223  Progress: 2909 on 6223  Progress: 2910 on 6223  Progress: 2911 on 6223  Progress: 2912 on 6223  Progress: 2913 on 6223  Progress: 2914 on 6223  Progress: 2915 on 6223  Progress: 2916 on 6223  Progress: 2917 on 6223  Progress: 2918 on 6223  Progress: 2919 on 6223  Progress: 2920 on 6223  Progress: 2921 on 6223  Progress: 2922 on 6223  Progress: 2923 on 6223  Progress: 2924 on 6223  Progress: 2925 on 6223  Progress: 2926 on 6223  Progress: 2927 on 6223  Progress: 2928 on 6223  Progress: 2929 on 6223  Progress: 2930 on 6223  Progress: 2931 on 6223  Progress: 2932 on 6223  Progress: 2933 on 6223  Progress: 2934 on 6223  Progress: 2935 on 6223  Progress: 2936 on 6223  Progress: 2937 on 6223  Progress: 2938 on 6223  Progress: 2939 on 6223  Progress: 2940 on 6223  Progress: 2941 on 6223  Progress: 2942 on 6223  Progress: 2943 on 6223  Progress: 2944 on 6223  Progress: 2945 on 6223  Progress: 2946 on 6223  Progress: 2947 on 6223  Progress: 2948 on 6223  Progress: 2949 on 6223  Progress: 2950 on 6223  Progress: 2951 on 6223  Progress: 2952 on 6223  Progress: 2953 on 6223  Progress: 2954 on 6223  Progress: 2955 on 6223  Progress: 2956 on 6223  Progress: 2957 on 6223  Progress: 2958 on 6223  Progress: 2959 on 6223  Progress: 2960 on 6223  Progress: 2961 on 6223  Progress: 2962 on 6223  Progress: 2963 on 6223  Progress: 2964 on 6223  Progress: 2965 on 6223  Progress: 2966 on 6223  Progress: 2967 on 6223  Progress: 2968 on 6223  Progress: 2969 on 6223  Progress: 2970 on 6223  Progress: 2971 on 6223  Progress: 2972 on 6223  Progress: 2973 on 6223  Progress: 2974 on 6223  Progress: 2975 on 6223  Progress: 2976 on 6223  Progress: 2977 on 6223  Progress: 2978 on 6223  Progress: 2979 on 6223  Progress: 2980 on 6223  Progress: 2981 on 6223  Progress: 2982 on 6223  Progress: 2983 on 6223  Progress: 2984 on 6223  Progress: 2985 on 6223  Progress: 2986 on 6223  Progress: 2987 on 6223  Progress: 2988 on 6223  Progress: 2989 on 6223  Progress: 2990 on 6223  Progress: 2991 on 6223  Progress: 2992 on 6223  Progress: 2993 on 6223  Progress: 2994 on 6223  Progress: 2995 on 6223  Progress: 2996 on 6223  Progress: 2997 on 6223  Progress: 2998 on 6223  Progress: 2999 on 6223  Progress: 3000 on 6223  Progress: 3001 on 6223  Progress: 3002 on 6223  Progress: 3003 on 6223  Progress: 3004 on 6223  Progress: 3005 on 6223  Progress: 3006 on 6223  Progress: 3007 on 6223  Progress: 3008 on 6223  Progress: 3009 on 6223  Progress: 3010 on 6223  Progress: 3011 on 6223  Progress: 3012 on 6223  Progress: 3013 on 6223  Progress: 3014 on 6223  Progress: 3015 on 6223  Progress: 3016 on 6223  Progress: 3017 on 6223  Progress: 3018 on 6223  Progress: 3019 on 6223  Progress: 3020 on 6223  Progress: 3021 on 6223  Progress: 3022 on 6223  Progress: 3023 on 6223  Progress: 3024 on 6223  Progress: 3025 on 6223  Progress: 3026 on 6223  Progress: 3027 on 6223  Progress: 3028 on 6223  Progress: 3029 on 6223  Progress: 3030 on 6223  Progress: 3031 on 6223  Progress: 3032 on 6223  Progress: 3033 on 6223  Progress: 3034 on 6223  Progress: 3035 on 6223  Progress: 3036 on 6223  Progress: 3037 on 6223  Progress: 3038 on 6223  Progress: 3039 on 6223  Progress: 3040 on 6223  Progress: 3041 on 6223  Progress: 3042 on 6223  Progress: 3043 on 6223  Progress: 3044 on 6223  Progress: 3045 on 6223  Progress: 3046 on 6223  Progress: 3047 on 6223  Progress: 3048 on 6223  Progress: 3049 on 6223  Progress: 3050 on 6223  Progress: 3051 on 6223  Progress: 3052 on 6223  Progress: 3053 on 6223  Progress: 3054 on 6223  Progress: 3055 on 6223  Progress: 3056 on 6223  Progress: 3057 on 6223  Progress: 3058 on 6223  Progress: 3059 on 6223  Progress: 3060 on 6223  Progress: 3061 on 6223  Progress: 3062 on 6223  Progress: 3063 on 6223  Progress: 3064 on 6223  Progress: 3065 on 6223  Progress: 3066 on 6223  Progress: 3067 on 6223  Progress: 3068 on 6223  Progress: 3069 on 6223  Progress: 3070 on 6223  Progress: 3071 on 6223  Progress: 3072 on 6223  Progress: 3073 on 6223  Progress: 3074 on 6223  Progress: 3075 on 6223  Progress: 3076 on 6223  Progress: 3077 on 6223  Progress: 3078 on 6223  Progress: 3079 on 6223  Progress: 3080 on 6223  Progress: 3081 on 6223  Progress: 3082 on 6223  Progress: 3083 on 6223  Progress: 3084 on 6223  Progress: 3085 on 6223  Progress: 3086 on 6223  Progress: 3087 on 6223  Progress: 3088 on 6223  Progress: 3089 on 6223  Progress: 3090 on 6223  Progress: 3091 on 6223  Progress: 3092 on 6223  Progress: 3093 on 6223  Progress: 3094 on 6223  Progress: 3095 on 6223  Progress: 3096 on 6223  Progress: 3097 on 6223  Progress: 3098 on 6223  Progress: 3099 on 6223  Progress: 3100 on 6223  Progress: 3101 on 6223  Progress: 3102 on 6223  Progress: 3103 on 6223  Progress: 3104 on 6223  Progress: 3105 on 6223  Progress: 3106 on 6223  Progress: 3107 on 6223  Progress: 3108 on 6223  Progress: 3109 on 6223  Progress: 3110 on 6223  Progress: 3111 on 6223  Progress: 3112 on 6223  Progress: 3113 on 6223  Progress: 3114 on 6223  Progress: 3115 on 6223  Progress: 3116 on 6223  Progress: 3117 on 6223  Progress: 3118 on 6223  Progress: 3119 on 6223  Progress: 3120 on 6223  Progress: 3121 on 6223  Progress: 3122 on 6223  Progress: 3123 on 6223  Progress: 3124 on 6223  Progress: 3125 on 6223  Progress: 3126 on 6223  Progress: 3127 on 6223  Progress: 3128 on 6223  Progress: 3129 on 6223  Progress: 3130 on 6223  Progress: 3131 on 6223  Progress: 3132 on 6223  Progress: 3133 on 6223  Progress: 3134 on 6223  Progress: 3135 on 6223  Progress: 3136 on 6223  Progress: 3137 on 6223  Progress: 3138 on 6223  Progress: 3139 on 6223  Progress: 3140 on 6223  Progress: 3141 on 6223  Progress: 3142 on 6223  Progress: 3143 on 6223  Progress: 3144 on 6223  Progress: 3145 on 6223  Progress: 3146 on 6223  Progress: 3147 on 6223  Progress: 3148 on 6223  Progress: 3149 on 6223  Progress: 3150 on 6223  Progress: 3151 on 6223  Progress: 3152 on 6223  Progress: 3153 on 6223  Progress: 3154 on 6223  Progress: 3155 on 6223  Progress: 3156 on 6223  Progress: 3157 on 6223  Progress: 3158 on 6223  Progress: 3159 on 6223  Progress: 3160 on 6223  Progress: 3161 on 6223  Progress: 3162 on 6223  Progress: 3163 on 6223  Progress: 3164 on 6223  Progress: 3165 on 6223  Progress: 3166 on 6223  Progress: 3167 on 6223  Progress: 3168 on 6223  Progress: 3169 on 6223  Progress: 3170 on 6223  Progress: 3171 on 6223  Progress: 3172 on 6223  Progress: 3173 on 6223  Progress: 3174 on 6223  Progress: 3175 on 6223  Progress: 3176 on 6223  Progress: 3177 on 6223  Progress: 3178 on 6223  Progress: 3179 on 6223  Progress: 3180 on 6223  Progress: 3181 on 6223  Progress: 3182 on 6223  Progress: 3183 on 6223  Progress: 3184 on 6223  Progress: 3185 on 6223  Progress: 3186 on 6223  Progress: 3187 on 6223  Progress: 3188 on 6223  Progress: 3189 on 6223  Progress: 3190 on 6223  Progress: 3191 on 6223  Progress: 3192 on 6223  Progress: 3193 on 6223  Progress: 3194 on 6223  Progress: 3195 on 6223  Progress: 3196 on 6223  Progress: 3197 on 6223  Progress: 3198 on 6223  Progress: 3199 on 6223  Progress: 3200 on 6223  Progress: 3201 on 6223  Progress: 3202 on 6223  Progress: 3203 on 6223  Progress: 3204 on 6223  Progress: 3205 on 6223  Progress: 3206 on 6223  Progress: 3207 on 6223  Progress: 3208 on 6223  Progress: 3209 on 6223  Progress: 3210 on 6223  Progress: 3211 on 6223  Progress: 3212 on 6223  Progress: 3213 on 6223  Progress: 3214 on 6223  Progress: 3215 on 6223  Progress: 3216 on 6223  Progress: 3217 on 6223  Progress: 3218 on 6223  Progress: 3219 on 6223  Progress: 3220 on 6223  Progress: 3221 on 6223  Progress: 3222 on 6223  Progress: 3223 on 6223  Progress: 3224 on 6223  Progress: 3225 on 6223  Progress: 3226 on 6223  Progress: 3227 on 6223  Progress: 3228 on 6223  Progress: 3229 on 6223  Progress: 3230 on 6223  Progress: 3231 on 6223  Progress: 3232 on 6223  Progress: 3233 on 6223  Progress: 3234 on 6223  Progress: 3235 on 6223  Progress: 3236 on 6223  Progress: 3237 on 6223  Progress: 3238 on 6223  Progress: 3239 on 6223  Progress: 3240 on 6223  Progress: 3241 on 6223  Progress: 3242 on 6223  Progress: 3243 on 6223  Progress: 3244 on 6223  Progress: 3245 on 6223  Progress: 3246 on 6223  Progress: 3247 on 6223  Progress: 3248 on 6223  Progress: 3249 on 6223  Progress: 3250 on 6223  Progress: 3251 on 6223  Progress: 3252 on 6223  Progress: 3253 on 6223  Progress: 3254 on 6223  Progress: 3255 on 6223  Progress: 3256 on 6223  Progress: 3257 on 6223  Progress: 3258 on 6223  Progress: 3259 on 6223  Progress: 3260 on 6223  Progress: 3261 on 6223  Progress: 3262 on 6223  Progress: 3263 on 6223  Progress: 3264 on 6223  Progress: 3265 on 6223  Progress: 3266 on 6223  Progress: 3267 on 6223  Progress: 3268 on 6223  Progress: 3269 on 6223  Progress: 3270 on 6223  Progress: 3271 on 6223  Progress: 3272 on 6223  Progress: 3273 on 6223  Progress: 3274 on 6223  Progress: 3275 on 6223  Progress: 3276 on 6223  Progress: 3277 on 6223  Progress: 3278 on 6223  Progress: 3279 on 6223  Progress: 3280 on 6223  Progress: 3281 on 6223  Progress: 3282 on 6223  Progress: 3283 on 6223  Progress: 3284 on 6223  Progress: 3285 on 6223  Progress: 3286 on 6223  Progress: 3287 on 6223  Progress: 3288 on 6223  Progress: 3289 on 6223  Progress: 3290 on 6223  Progress: 3291 on 6223  Progress: 3292 on 6223  Progress: 3293 on 6223  Progress: 3294 on 6223  Progress: 3295 on 6223  Progress: 3296 on 6223  Progress: 3297 on 6223  Progress: 3298 on 6223  Progress: 3299 on 6223  Progress: 3300 on 6223  Progress: 3301 on 6223  Progress: 3302 on 6223  Progress: 3303 on 6223  Progress: 3304 on 6223  Progress: 3305 on 6223  Progress: 3306 on 6223  Progress: 3307 on 6223  Progress: 3308 on 6223  Progress: 3309 on 6223  Progress: 3310 on 6223  Progress: 3311 on 6223  Progress: 3312 on 6223  Progress: 3313 on 6223  Progress: 3314 on 6223  Progress: 3315 on 6223  Progress: 3316 on 6223  Progress: 3317 on 6223  Progress: 3318 on 6223  Progress: 3319 on 6223  Progress: 3320 on 6223  Progress: 3321 on 6223  Progress: 3322 on 6223  Progress: 3323 on 6223  Progress: 3324 on 6223  Progress: 3325 on 6223  Progress: 3326 on 6223  Progress: 3327 on 6223  Progress: 3328 on 6223  Progress: 3329 on 6223  Progress: 3330 on 6223  Progress: 3331 on 6223  Progress: 3332 on 6223  Progress: 3333 on 6223  Progress: 3334 on 6223  Progress: 3335 on 6223  Progress: 3336 on 6223  Progress: 3337 on 6223  Progress: 3338 on 6223  Progress: 3339 on 6223  Progress: 3340 on 6223  Progress: 3341 on 6223  Progress: 3342 on 6223  Progress: 3343 on 6223  Progress: 3344 on 6223  Progress: 3345 on 6223  Progress: 3346 on 6223  Progress: 3347 on 6223  Progress: 3348 on 6223  Progress: 3349 on 6223  Progress: 3350 on 6223  Progress: 3351 on 6223  Progress: 3352 on 6223  Progress: 3353 on 6223  Progress: 3354 on 6223  Progress: 3355 on 6223  Progress: 3356 on 6223  Progress: 3357 on 6223  Progress: 3358 on 6223  Progress: 3359 on 6223  Progress: 3360 on 6223  Progress: 3361 on 6223  Progress: 3362 on 6223  Progress: 3363 on 6223  Progress: 3364 on 6223  Progress: 3365 on 6223  Progress: 3366 on 6223  Progress: 3367 on 6223  Progress: 3368 on 6223  Progress: 3369 on 6223  Progress: 3370 on 6223  Progress: 3371 on 6223  Progress: 3372 on 6223  Progress: 3373 on 6223  Progress: 3374 on 6223  Progress: 3375 on 6223  Progress: 3376 on 6223  Progress: 3377 on 6223  Progress: 3378 on 6223  Progress: 3379 on 6223  Progress: 3380 on 6223  Progress: 3381 on 6223  Progress: 3382 on 6223  Progress: 3383 on 6223  Progress: 3384 on 6223  Progress: 3385 on 6223  Progress: 3386 on 6223  Progress: 3387 on 6223  Progress: 3388 on 6223  Progress: 3389 on 6223  Progress: 3390 on 6223  Progress: 3391 on 6223  Progress: 3392 on 6223  Progress: 3393 on 6223  Progress: 3394 on 6223  Progress: 3395 on 6223  Progress: 3396 on 6223  Progress: 3397 on 6223  Progress: 3398 on 6223  Progress: 3399 on 6223  Progress: 3400 on 6223  Progress: 3401 on 6223  Progress: 3402 on 6223  Progress: 3403 on 6223  Progress: 3404 on 6223  Progress: 3405 on 6223  Progress: 3406 on 6223  Progress: 3407 on 6223  Progress: 3408 on 6223  Progress: 3409 on 6223  Progress: 3410 on 6223  Progress: 3411 on 6223  Progress: 3412 on 6223  Progress: 3413 on 6223  Progress: 3414 on 6223  Progress: 3415 on 6223  Progress: 3416 on 6223  Progress: 3417 on 6223  Progress: 3418 on 6223  Progress: 3419 on 6223  Progress: 3420 on 6223  Progress: 3421 on 6223  Progress: 3422 on 6223  Progress: 3423 on 6223  Progress: 3424 on 6223  Progress: 3425 on 6223  Progress: 3426 on 6223  Progress: 3427 on 6223  Progress: 3428 on 6223  Progress: 3429 on 6223  Progress: 3430 on 6223  Progress: 3431 on 6223  Progress: 3432 on 6223  Progress: 3433 on 6223  Progress: 3434 on 6223  Progress: 3435 on 6223  Progress: 3436 on 6223  Progress: 3437 on 6223  Progress: 3438 on 6223  Progress: 3439 on 6223  Progress: 3440 on 6223  Progress: 3441 on 6223  Progress: 3442 on 6223  Progress: 3443 on 6223  Progress: 3444 on 6223  Progress: 3445 on 6223  Progress: 3446 on 6223  Progress: 3447 on 6223  Progress: 3448 on 6223  Progress: 3449 on 6223  Progress: 3450 on 6223  Progress: 3451 on 6223  Progress: 3452 on 6223  Progress: 3453 on 6223  Progress: 3454 on 6223  Progress: 3455 on 6223  Progress: 3456 on 6223  Progress: 3457 on 6223  Progress: 3458 on 6223  Progress: 3459 on 6223  Progress: 3460 on 6223  Progress: 3461 on 6223  Progress: 3462 on 6223  Progress: 3463 on 6223  Progress: 3464 on 6223  Progress: 3465 on 6223  Progress: 3466 on 6223  Progress: 3467 on 6223  Progress: 3468 on 6223  Progress: 3469 on 6223  Progress: 3470 on 6223  Progress: 3471 on 6223  Progress: 3472 on 6223  Progress: 3473 on 6223  Progress: 3474 on 6223  Progress: 3475 on 6223  Progress: 3476 on 6223  Progress: 3477 on 6223  Progress: 3478 on 6223  Progress: 3479 on 6223  Progress: 3480 on 6223  Progress: 3481 on 6223  Progress: 3482 on 6223  Progress: 3483 on 6223  Progress: 3484 on 6223  Progress: 3485 on 6223  Progress: 3486 on 6223  Progress: 3487 on 6223  Progress: 3488 on 6223  Progress: 3489 on 6223  Progress: 3490 on 6223  Progress: 3491 on 6223  Progress: 3492 on 6223  Progress: 3493 on 6223  Progress: 3494 on 6223  Progress: 3495 on 6223  Progress: 3496 on 6223  Progress: 3497 on 6223  Progress: 3498 on 6223  Progress: 3499 on 6223  Progress: 3500 on 6223  Progress: 3501 on 6223  Progress: 3502 on 6223  Progress: 3503 on 6223  Progress: 3504 on 6223  Progress: 3505 on 6223  Progress: 3506 on 6223  Progress: 3507 on 6223  Progress: 3508 on 6223  Progress: 3509 on 6223  Progress: 3510 on 6223  Progress: 3511 on 6223  Progress: 3512 on 6223  Progress: 3513 on 6223  Progress: 3514 on 6223  Progress: 3515 on 6223  Progress: 3516 on 6223  Progress: 3517 on 6223  Progress: 3518 on 6223  Progress: 3519 on 6223  Progress: 3520 on 6223  Progress: 3521 on 6223  Progress: 3522 on 6223  Progress: 3523 on 6223  Progress: 3524 on 6223  Progress: 3525 on 6223  Progress: 3526 on 6223  Progress: 3527 on 6223  Progress: 3528 on 6223  Progress: 3529 on 6223  Progress: 3530 on 6223  Progress: 3531 on 6223  Progress: 3532 on 6223  Progress: 3533 on 6223  Progress: 3534 on 6223  Progress: 3535 on 6223  Progress: 3536 on 6223  Progress: 3537 on 6223  Progress: 3538 on 6223  Progress: 3539 on 6223  Progress: 3540 on 6223  Progress: 3541 on 6223  Progress: 3542 on 6223  Progress: 3543 on 6223  Progress: 3544 on 6223  Progress: 3545 on 6223  Progress: 3546 on 6223  Progress: 3547 on 6223  Progress: 3548 on 6223  Progress: 3549 on 6223  Progress: 3550 on 6223  Progress: 3551 on 6223  Progress: 3552 on 6223  Progress: 3553 on 6223  Progress: 3554 on 6223  Progress: 3555 on 6223  Progress: 3556 on 6223  Progress: 3557 on 6223  Progress: 3558 on 6223  Progress: 3559 on 6223  Progress: 3560 on 6223  Progress: 3561 on 6223  Progress: 3562 on 6223  Progress: 3563 on 6223  Progress: 3564 on 6223  Progress: 3565 on 6223  Progress: 3566 on 6223  Progress: 3567 on 6223  Progress: 3568 on 6223  Progress: 3569 on 6223  Progress: 3570 on 6223  Progress: 3571 on 6223  Progress: 3572 on 6223  Progress: 3573 on 6223  Progress: 3574 on 6223  Progress: 3575 on 6223  Progress: 3576 on 6223  Progress: 3577 on 6223  Progress: 3578 on 6223  Progress: 3579 on 6223  Progress: 3580 on 6223  Progress: 3581 on 6223  Progress: 3582 on 6223  Progress: 3583 on 6223  Progress: 3584 on 6223  Progress: 3585 on 6223  Progress: 3586 on 6223  Progress: 3587 on 6223  Progress: 3588 on 6223  Progress: 3589 on 6223  Progress: 3590 on 6223  Progress: 3591 on 6223  Progress: 3592 on 6223  Progress: 3593 on 6223  Progress: 3594 on 6223  Progress: 3595 on 6223  Progress: 3596 on 6223  Progress: 3597 on 6223  Progress: 3598 on 6223  Progress: 3599 on 6223  Progress: 3600 on 6223  Progress: 3601 on 6223  Progress: 3602 on 6223  Progress: 3603 on 6223  Progress: 3604 on 6223  Progress: 3605 on 6223  Progress: 3606 on 6223  Progress: 3607 on 6223  Progress: 3608 on 6223  Progress: 3609 on 6223  Progress: 3610 on 6223  Progress: 3611 on 6223  Progress: 3612 on 6223  Progress: 3613 on 6223  Progress: 3614 on 6223  Progress: 3615 on 6223  Progress: 3616 on 6223  Progress: 3617 on 6223  Progress: 3618 on 6223  Progress: 3619 on 6223  Progress: 3620 on 6223  Progress: 3621 on 6223  Progress: 3622 on 6223  Progress: 3623 on 6223  Progress: 3624 on 6223  Progress: 3625 on 6223  Progress: 3626 on 6223  Progress: 3627 on 6223  Progress: 3628 on 6223  Progress: 3629 on 6223  Progress: 3630 on 6223  Progress: 3631 on 6223  Progress: 3632 on 6223  Progress: 3633 on 6223  Progress: 3634 on 6223  Progress: 3635 on 6223  Progress: 3636 on 6223  Progress: 3637 on 6223  Progress: 3638 on 6223  Progress: 3639 on 6223  Progress: 3640 on 6223  Progress: 3641 on 6223  Progress: 3642 on 6223  Progress: 3643 on 6223  Progress: 3644 on 6223  Progress: 3645 on 6223  Progress: 3646 on 6223  Progress: 3647 on 6223  Progress: 3648 on 6223  Progress: 3649 on 6223  Progress: 3650 on 6223  Progress: 3651 on 6223  Progress: 3652 on 6223  Progress: 3653 on 6223  Progress: 3654 on 6223  Progress: 3655 on 6223  Progress: 3656 on 6223  Progress: 3657 on 6223  Progress: 3658 on 6223  Progress: 3659 on 6223  Progress: 3660 on 6223  Progress: 3661 on 6223  Progress: 3662 on 6223  Progress: 3663 on 6223  Progress: 3664 on 6223  Progress: 3665 on 6223  Progress: 3666 on 6223  Progress: 3667 on 6223  Progress: 3668 on 6223  Progress: 3669 on 6223  Progress: 3670 on 6223  Progress: 3671 on 6223  Progress: 3672 on 6223  Progress: 3673 on 6223  Progress: 3674 on 6223  Progress: 3675 on 6223  Progress: 3676 on 6223  Progress: 3677 on 6223  Progress: 3678 on 6223  Progress: 3679 on 6223  Progress: 3680 on 6223  Progress: 3681 on 6223  Progress: 3682 on 6223  Progress: 3683 on 6223  Progress: 3684 on 6223  Progress: 3685 on 6223  Progress: 3686 on 6223  Progress: 3687 on 6223  Progress: 3688 on 6223  Progress: 3689 on 6223  Progress: 3690 on 6223  Progress: 3691 on 6223  Progress: 3692 on 6223  Progress: 3693 on 6223  Progress: 3694 on 6223  Progress: 3695 on 6223  Progress: 3696 on 6223  Progress: 3697 on 6223  Progress: 3698 on 6223  Progress: 3699 on 6223  Progress: 3700 on 6223  Progress: 3701 on 6223  Progress: 3702 on 6223  Progress: 3703 on 6223  Progress: 3704 on 6223  Progress: 3705 on 6223  Progress: 3706 on 6223  Progress: 3707 on 6223  Progress: 3708 on 6223  Progress: 3709 on 6223  Progress: 3710 on 6223  Progress: 3711 on 6223  Progress: 3712 on 6223  Progress: 3713 on 6223  Progress: 3714 on 6223  Progress: 3715 on 6223  Progress: 3716 on 6223  Progress: 3717 on 6223  Progress: 3718 on 6223  Progress: 3719 on 6223  Progress: 3720 on 6223  Progress: 3721 on 6223  Progress: 3722 on 6223  Progress: 3723 on 6223  Progress: 3724 on 6223  Progress: 3725 on 6223  Progress: 3726 on 6223  Progress: 3727 on 6223  Progress: 3728 on 6223  Progress: 3729 on 6223  Progress: 3730 on 6223  Progress: 3731 on 6223  Progress: 3732 on 6223  Progress: 3733 on 6223  Progress: 3734 on 6223  Progress: 3735 on 6223  Progress: 3736 on 6223  Progress: 3737 on 6223  Progress: 3738 on 6223  Progress: 3739 on 6223  Progress: 3740 on 6223  Progress: 3741 on 6223  Progress: 3742 on 6223  Progress: 3743 on 6223  Progress: 3744 on 6223  Progress: 3745 on 6223  Progress: 3746 on 6223  Progress: 3747 on 6223  Progress: 3748 on 6223  Progress: 3749 on 6223  Progress: 3750 on 6223  Progress: 3751 on 6223  Progress: 3752 on 6223  Progress: 3753 on 6223  Progress: 3754 on 6223  Progress: 3755 on 6223  Progress: 3756 on 6223  Progress: 3757 on 6223  Progress: 3758 on 6223  Progress: 3759 on 6223  Progress: 3760 on 6223  Progress: 3761 on 6223  Progress: 3762 on 6223  Progress: 3763 on 6223  Progress: 3764 on 6223  Progress: 3765 on 6223  Progress: 3766 on 6223  Progress: 3767 on 6223  Progress: 3768 on 6223  Progress: 3769 on 6223  Progress: 3770 on 6223  Progress: 3771 on 6223  Progress: 3772 on 6223  Progress: 3773 on 6223  Progress: 3774 on 6223  Progress: 3775 on 6223  Progress: 3776 on 6223  Progress: 3777 on 6223  Progress: 3778 on 6223  Progress: 3779 on 6223  Progress: 3780 on 6223  Progress: 3781 on 6223  Progress: 3782 on 6223  Progress: 3783 on 6223  Progress: 3784 on 6223  Progress: 3785 on 6223  Progress: 3786 on 6223  Progress: 3787 on 6223  Progress: 3788 on 6223  Progress: 3789 on 6223  Progress: 3790 on 6223  Progress: 3791 on 6223  Progress: 3792 on 6223  Progress: 3793 on 6223  Progress: 3794 on 6223  Progress: 3795 on 6223  Progress: 3796 on 6223  Progress: 3797 on 6223  Progress: 3798 on 6223  Progress: 3799 on 6223  Progress: 3800 on 6223  Progress: 3801 on 6223  Progress: 3802 on 6223  Progress: 3803 on 6223  Progress: 3804 on 6223  Progress: 3805 on 6223  Progress: 3806 on 6223  Progress: 3807 on 6223  Progress: 3808 on 6223  Progress: 3809 on 6223  Progress: 3810 on 6223  Progress: 3811 on 6223  Progress: 3812 on 6223  Progress: 3813 on 6223  Progress: 3814 on 6223  Progress: 3815 on 6223  Progress: 3816 on 6223  Progress: 3817 on 6223  Progress: 3818 on 6223  Progress: 3819 on 6223  Progress: 3820 on 6223  Progress: 3821 on 6223  Progress: 3822 on 6223  Progress: 3823 on 6223  Progress: 3824 on 6223  Progress: 3825 on 6223  Progress: 3826 on 6223  Progress: 3827 on 6223  Progress: 3828 on 6223  Progress: 3829 on 6223  Progress: 3830 on 6223  Progress: 3831 on 6223  Progress: 3832 on 6223  Progress: 3833 on 6223  Progress: 3834 on 6223  Progress: 3835 on 6223  Progress: 3836 on 6223  Progress: 3837 on 6223  Progress: 3838 on 6223  Progress: 3839 on 6223  Progress: 3840 on 6223  Progress: 3841 on 6223  Progress: 3842 on 6223  Progress: 3843 on 6223  Progress: 3844 on 6223  Progress: 3845 on 6223  Progress: 3846 on 6223  Progress: 3847 on 6223  Progress: 3848 on 6223  Progress: 3849 on 6223  Progress: 3850 on 6223  Progress: 3851 on 6223  Progress: 3852 on 6223  Progress: 3853 on 6223  Progress: 3854 on 6223  Progress: 3855 on 6223  Progress: 3856 on 6223  Progress: 3857 on 6223  Progress: 3858 on 6223  Progress: 3859 on 6223  Progress: 3860 on 6223  Progress: 3861 on 6223  Progress: 3862 on 6223  Progress: 3863 on 6223  Progress: 3864 on 6223  Progress: 3865 on 6223  Progress: 3866 on 6223  Progress: 3867 on 6223  Progress: 3868 on 6223  Progress: 3869 on 6223  Progress: 3870 on 6223  Progress: 3871 on 6223  Progress: 3872 on 6223  Progress: 3873 on 6223  Progress: 3874 on 6223  Progress: 3875 on 6223  Progress: 3876 on 6223  Progress: 3877 on 6223  Progress: 3878 on 6223  Progress: 3879 on 6223  Progress: 3880 on 6223  Progress: 3881 on 6223  Progress: 3882 on 6223  Progress: 3883 on 6223  Progress: 3884 on 6223  Progress: 3885 on 6223  Progress: 3886 on 6223  Progress: 3887 on 6223  Progress: 3888 on 6223  Progress: 3889 on 6223  Progress: 3890 on 6223  Progress: 3891 on 6223  Progress: 3892 on 6223  Progress: 3893 on 6223  Progress: 3894 on 6223  Progress: 3895 on 6223  Progress: 3896 on 6223  Progress: 3897 on 6223  Progress: 3898 on 6223  Progress: 3899 on 6223  Progress: 3900 on 6223  Progress: 3901 on 6223  Progress: 3902 on 6223  Progress: 3903 on 6223  Progress: 3904 on 6223  Progress: 3905 on 6223  Progress: 3906 on 6223  Progress: 3907 on 6223  Progress: 3908 on 6223  Progress: 3909 on 6223  Progress: 3910 on 6223  Progress: 3911 on 6223  Progress: 3912 on 6223  Progress: 3913 on 6223  Progress: 3914 on 6223  Progress: 3915 on 6223  Progress: 3916 on 6223  Progress: 3917 on 6223  Progress: 3918 on 6223  Progress: 3919 on 6223  Progress: 3920 on 6223  Progress: 3921 on 6223  Progress: 3922 on 6223  Progress: 3923 on 6223  Progress: 3924 on 6223  Progress: 3925 on 6223  Progress: 3926 on 6223  Progress: 3927 on 6223  Progress: 3928 on 6223  Progress: 3929 on 6223  Progress: 3930 on 6223  Progress: 3931 on 6223  Progress: 3932 on 6223  Progress: 3933 on 6223  Progress: 3934 on 6223  Progress: 3935 on 6223  Progress: 3936 on 6223  Progress: 3937 on 6223  Progress: 3938 on 6223  Progress: 3939 on 6223  Progress: 3940 on 6223  Progress: 3941 on 6223  Progress: 3942 on 6223  Progress: 3943 on 6223  Progress: 3944 on 6223  Progress: 3945 on 6223  Progress: 3946 on 6223  Progress: 3947 on 6223  Progress: 3948 on 6223  Progress: 3949 on 6223  Progress: 3950 on 6223  Progress: 3951 on 6223  Progress: 3952 on 6223  Progress: 3953 on 6223  Progress: 3954 on 6223  Progress: 3955 on 6223  Progress: 3956 on 6223  Progress: 3957 on 6223  Progress: 3958 on 6223  Progress: 3959 on 6223  Progress: 3960 on 6223  Progress: 3961 on 6223  Progress: 3962 on 6223  Progress: 3963 on 6223  Progress: 3964 on 6223  Progress: 3965 on 6223  Progress: 3966 on 6223  Progress: 3967 on 6223  Progress: 3968 on 6223  Progress: 3969 on 6223  Progress: 3970 on 6223  Progress: 3971 on 6223  Progress: 3972 on 6223  Progress: 3973 on 6223  Progress: 3974 on 6223  Progress: 3975 on 6223  Progress: 3976 on 6223  Progress: 3977 on 6223  Progress: 3978 on 6223  Progress: 3979 on 6223  Progress: 3980 on 6223  Progress: 3981 on 6223  Progress: 3982 on 6223  Progress: 3983 on 6223  Progress: 3984 on 6223  Progress: 3985 on 6223  Progress: 3986 on 6223  Progress: 3987 on 6223  Progress: 3988 on 6223  Progress: 3989 on 6223  Progress: 3990 on 6223  Progress: 3991 on 6223  Progress: 3992 on 6223  Progress: 3993 on 6223  Progress: 3994 on 6223  Progress: 3995 on 6223  Progress: 3996 on 6223  Progress: 3997 on 6223  Progress: 3998 on 6223  Progress: 3999 on 6223  Progress: 4000 on 6223  Progress: 4001 on 6223  Progress: 4002 on 6223  Progress: 4003 on 6223  Progress: 4004 on 6223  Progress: 4005 on 6223  Progress: 4006 on 6223  Progress: 4007 on 6223  Progress: 4008 on 6223  Progress: 4009 on 6223  Progress: 4010 on 6223  Progress: 4011 on 6223  Progress: 4012 on 6223  Progress: 4013 on 6223  Progress: 4014 on 6223  Progress: 4015 on 6223  Progress: 4016 on 6223  Progress: 4017 on 6223  Progress: 4018 on 6223  Progress: 4019 on 6223  Progress: 4020 on 6223  Progress: 4021 on 6223  Progress: 4022 on 6223  Progress: 4023 on 6223  Progress: 4024 on 6223  Progress: 4025 on 6223  Progress: 4026 on 6223  Progress: 4027 on 6223  Progress: 4028 on 6223  Progress: 4029 on 6223  Progress: 4030 on 6223  Progress: 4031 on 6223  Progress: 4032 on 6223  Progress: 4033 on 6223  Progress: 4034 on 6223  Progress: 4035 on 6223  Progress: 4036 on 6223  Progress: 4037 on 6223  Progress: 4038 on 6223  Progress: 4039 on 6223  Progress: 4040 on 6223  Progress: 4041 on 6223  Progress: 4042 on 6223  Progress: 4043 on 6223  Progress: 4044 on 6223  Progress: 4045 on 6223  Progress: 4046 on 6223  Progress: 4047 on 6223  Progress: 4048 on 6223  Progress: 4049 on 6223  Progress: 4050 on 6223  Progress: 4051 on 6223  Progress: 4052 on 6223  Progress: 4053 on 6223  Progress: 4054 on 6223  Progress: 4055 on 6223  Progress: 4056 on 6223  Progress: 4057 on 6223  Progress: 4058 on 6223  Progress: 4059 on 6223  Progress: 4060 on 6223  Progress: 4061 on 6223  Progress: 4062 on 6223  Progress: 4063 on 6223  Progress: 4064 on 6223  Progress: 4065 on 6223  Progress: 4066 on 6223  Progress: 4067 on 6223  Progress: 4068 on 6223  Progress: 4069 on 6223  Progress: 4070 on 6223  Progress: 4071 on 6223  Progress: 4072 on 6223  Progress: 4073 on 6223  Progress: 4074 on 6223  Progress: 4075 on 6223  Progress: 4076 on 6223  Progress: 4077 on 6223  Progress: 4078 on 6223  Progress: 4079 on 6223  Progress: 4080 on 6223  Progress: 4081 on 6223  Progress: 4082 on 6223  Progress: 4083 on 6223  Progress: 4084 on 6223  Progress: 4085 on 6223  Progress: 4086 on 6223  Progress: 4087 on 6223  Progress: 4088 on 6223  Progress: 4089 on 6223  Progress: 4090 on 6223  Progress: 4091 on 6223  Progress: 4092 on 6223  Progress: 4093 on 6223  Progress: 4094 on 6223  Progress: 4095 on 6223  Progress: 4096 on 6223  Progress: 4097 on 6223  Progress: 4098 on 6223  Progress: 4099 on 6223  Progress: 4100 on 6223  Progress: 4101 on 6223  Progress: 4102 on 6223  Progress: 4103 on 6223  Progress: 4104 on 6223  Progress: 4105 on 6223  Progress: 4106 on 6223  Progress: 4107 on 6223  Progress: 4108 on 6223  Progress: 4109 on 6223  Progress: 4110 on 6223  Progress: 4111 on 6223  Progress: 4112 on 6223  Progress: 4113 on 6223  Progress: 4114 on 6223  Progress: 4115 on 6223  Progress: 4116 on 6223  Progress: 4117 on 6223  Progress: 4118 on 6223  Progress: 4119 on 6223  Progress: 4120 on 6223  Progress: 4121 on 6223  Progress: 4122 on 6223  Progress: 4123 on 6223  Progress: 4124 on 6223  Progress: 4125 on 6223  Progress: 4126 on 6223  Progress: 4127 on 6223  Progress: 4128 on 6223  Progress: 4129 on 6223  Progress: 4130 on 6223  Progress: 4131 on 6223  Progress: 4132 on 6223  Progress: 4133 on 6223  Progress: 4134 on 6223  Progress: 4135 on 6223  Progress: 4136 on 6223  Progress: 4137 on 6223  Progress: 4138 on 6223  Progress: 4139 on 6223  Progress: 4140 on 6223  Progress: 4141 on 6223  Progress: 4142 on 6223  Progress: 4143 on 6223  Progress: 4144 on 6223  Progress: 4145 on 6223  Progress: 4146 on 6223  Progress: 4147 on 6223  Progress: 4148 on 6223  Progress: 4149 on 6223  Progress: 4150 on 6223  Progress: 4151 on 6223  Progress: 4152 on 6223  Progress: 4153 on 6223  Progress: 4154 on 6223  Progress: 4155 on 6223  Progress: 4156 on 6223  Progress: 4157 on 6223  Progress: 4158 on 6223  Progress: 4159 on 6223  Progress: 4160 on 6223  Progress: 4161 on 6223  Progress: 4162 on 6223  Progress: 4163 on 6223  Progress: 4164 on 6223  Progress: 4165 on 6223  Progress: 4166 on 6223  Progress: 4167 on 6223  Progress: 4168 on 6223  Progress: 4169 on 6223  Progress: 4170 on 6223  Progress: 4171 on 6223  Progress: 4172 on 6223  Progress: 4173 on 6223  Progress: 4174 on 6223  Progress: 4175 on 6223  Progress: 4176 on 6223  Progress: 4177 on 6223  Progress: 4178 on 6223  Progress: 4179 on 6223  Progress: 4180 on 6223  Progress: 4181 on 6223  Progress: 4182 on 6223  Progress: 4183 on 6223  Progress: 4184 on 6223  Progress: 4185 on 6223  Progress: 4186 on 6223  Progress: 4187 on 6223  Progress: 4188 on 6223  Progress: 4189 on 6223  Progress: 4190 on 6223  Progress: 4191 on 6223  Progress: 4192 on 6223  Progress: 4193 on 6223  Progress: 4194 on 6223  Progress: 4195 on 6223  Progress: 4196 on 6223  Progress: 4197 on 6223  Progress: 4198 on 6223  Progress: 4199 on 6223  Progress: 4200 on 6223  Progress: 4201 on 6223  Progress: 4202 on 6223  Progress: 4203 on 6223  Progress: 4204 on 6223  Progress: 4205 on 6223  Progress: 4206 on 6223  Progress: 4207 on 6223  Progress: 4208 on 6223  Progress: 4209 on 6223  Progress: 4210 on 6223  Progress: 4211 on 6223  Progress: 4212 on 6223  Progress: 4213 on 6223  Progress: 4214 on 6223  Progress: 4215 on 6223  Progress: 4216 on 6223  Progress: 4217 on 6223  Progress: 4218 on 6223  Progress: 4219 on 6223  Progress: 4220 on 6223  Progress: 4221 on 6223  Progress: 4222 on 6223  Progress: 4223 on 6223  Progress: 4224 on 6223  Progress: 4225 on 6223  Progress: 4226 on 6223  Progress: 4227 on 6223  Progress: 4228 on 6223  Progress: 4229 on 6223  Progress: 4230 on 6223  Progress: 4231 on 6223  Progress: 4232 on 6223  Progress: 4233 on 6223  Progress: 4234 on 6223  Progress: 4235 on 6223  Progress: 4236 on 6223  Progress: 4237 on 6223  Progress: 4238 on 6223  Progress: 4239 on 6223  Progress: 4240 on 6223  Progress: 4241 on 6223  Progress: 4242 on 6223  Progress: 4243 on 6223  Progress: 4244 on 6223  Progress: 4245 on 6223  Progress: 4246 on 6223  Progress: 4247 on 6223  Progress: 4248 on 6223  Progress: 4249 on 6223  Progress: 4250 on 6223  Progress: 4251 on 6223  Progress: 4252 on 6223  Progress: 4253 on 6223  Progress: 4254 on 6223  Progress: 4255 on 6223  Progress: 4256 on 6223  Progress: 4257 on 6223  Progress: 4258 on 6223  Progress: 4259 on 6223  Progress: 4260 on 6223  Progress: 4261 on 6223  Progress: 4262 on 6223  Progress: 4263 on 6223  Progress: 4264 on 6223  Progress: 4265 on 6223  Progress: 4266 on 6223  Progress: 4267 on 6223  Progress: 4268 on 6223  Progress: 4269 on 6223  Progress: 4270 on 6223  Progress: 4271 on 6223  Progress: 4272 on 6223  Progress: 4273 on 6223  Progress: 4274 on 6223  Progress: 4275 on 6223  Progress: 4276 on 6223  Progress: 4277 on 6223  Progress: 4278 on 6223  Progress: 4279 on 6223  Progress: 4280 on 6223  Progress: 4281 on 6223  Progress: 4282 on 6223  Progress: 4283 on 6223  Progress: 4284 on 6223  Progress: 4285 on 6223  Progress: 4286 on 6223  Progress: 4287 on 6223  Progress: 4288 on 6223  Progress: 4289 on 6223  Progress: 4290 on 6223  Progress: 4291 on 6223  Progress: 4292 on 6223  Progress: 4293 on 6223  Progress: 4294 on 6223  Progress: 4295 on 6223  Progress: 4296 on 6223  Progress: 4297 on 6223  Progress: 4298 on 6223  Progress: 4299 on 6223  Progress: 4300 on 6223  Progress: 4301 on 6223  Progress: 4302 on 6223  Progress: 4303 on 6223  Progress: 4304 on 6223  Progress: 4305 on 6223  Progress: 4306 on 6223  Progress: 4307 on 6223  Progress: 4308 on 6223  Progress: 4309 on 6223  Progress: 4310 on 6223  Progress: 4311 on 6223  Progress: 4312 on 6223  Progress: 4313 on 6223  Progress: 4314 on 6223  Progress: 4315 on 6223  Progress: 4316 on 6223  Progress: 4317 on 6223  Progress: 4318 on 6223  Progress: 4319 on 6223  Progress: 4320 on 6223  Progress: 4321 on 6223  Progress: 4322 on 6223  Progress: 4323 on 6223  Progress: 4324 on 6223  Progress: 4325 on 6223  Progress: 4326 on 6223  Progress: 4327 on 6223  Progress: 4328 on 6223  Progress: 4329 on 6223  Progress: 4330 on 6223  Progress: 4331 on 6223  Progress: 4332 on 6223  Progress: 4333 on 6223  Progress: 4334 on 6223  Progress: 4335 on 6223  Progress: 4336 on 6223  Progress: 4337 on 6223  Progress: 4338 on 6223  Progress: 4339 on 6223  Progress: 4340 on 6223  Progress: 4341 on 6223  Progress: 4342 on 6223  Progress: 4343 on 6223  Progress: 4344 on 6223  Progress: 4345 on 6223  Progress: 4346 on 6223  Progress: 4347 on 6223  Progress: 4348 on 6223  Progress: 4349 on 6223  Progress: 4350 on 6223  Progress: 4351 on 6223  Progress: 4352 on 6223  Progress: 4353 on 6223  Progress: 4354 on 6223  Progress: 4355 on 6223  Progress: 4356 on 6223  Progress: 4357 on 6223  Progress: 4358 on 6223  Progress: 4359 on 6223  Progress: 4360 on 6223  Progress: 4361 on 6223  Progress: 4362 on 6223  Progress: 4363 on 6223  Progress: 4364 on 6223  Progress: 4365 on 6223  Progress: 4366 on 6223  Progress: 4367 on 6223  Progress: 4368 on 6223  Progress: 4369 on 6223  Progress: 4370 on 6223  Progress: 4371 on 6223  Progress: 4372 on 6223  Progress: 4373 on 6223  Progress: 4374 on 6223  Progress: 4375 on 6223  Progress: 4376 on 6223  Progress: 4377 on 6223  Progress: 4378 on 6223  Progress: 4379 on 6223  Progress: 4380 on 6223  Progress: 4381 on 6223  Progress: 4382 on 6223  Progress: 4383 on 6223  Progress: 4384 on 6223  Progress: 4385 on 6223  Progress: 4386 on 6223  Progress: 4387 on 6223  Progress: 4388 on 6223  Progress: 4389 on 6223  Progress: 4390 on 6223  Progress: 4391 on 6223  Progress: 4392 on 6223  Progress: 4393 on 6223  Progress: 4394 on 6223  Progress: 4395 on 6223  Progress: 4396 on 6223  Progress: 4397 on 6223  Progress: 4398 on 6223  Progress: 4399 on 6223  Progress: 4400 on 6223  Progress: 4401 on 6223  Progress: 4402 on 6223  Progress: 4403 on 6223  Progress: 4404 on 6223  Progress: 4405 on 6223  Progress: 4406 on 6223  Progress: 4407 on 6223  Progress: 4408 on 6223  Progress: 4409 on 6223  Progress: 4410 on 6223  Progress: 4411 on 6223  Progress: 4412 on 6223  Progress: 4413 on 6223  Progress: 4414 on 6223  Progress: 4415 on 6223  Progress: 4416 on 6223  Progress: 4417 on 6223  Progress: 4418 on 6223  Progress: 4419 on 6223  Progress: 4420 on 6223  Progress: 4421 on 6223  Progress: 4422 on 6223  Progress: 4423 on 6223  Progress: 4424 on 6223  Progress: 4425 on 6223  Progress: 4426 on 6223  Progress: 4427 on 6223  Progress: 4428 on 6223  Progress: 4429 on 6223  Progress: 4430 on 6223  Progress: 4431 on 6223  Progress: 4432 on 6223  Progress: 4433 on 6223  Progress: 4434 on 6223  Progress: 4435 on 6223  Progress: 4436 on 6223  Progress: 4437 on 6223  Progress: 4438 on 6223  Progress: 4439 on 6223  Progress: 4440 on 6223  Progress: 4441 on 6223  Progress: 4442 on 6223  Progress: 4443 on 6223  Progress: 4444 on 6223  Progress: 4445 on 6223  Progress: 4446 on 6223  Progress: 4447 on 6223  Progress: 4448 on 6223  Progress: 4449 on 6223  Progress: 4450 on 6223  Progress: 4451 on 6223  Progress: 4452 on 6223  Progress: 4453 on 6223  Progress: 4454 on 6223  Progress: 4455 on 6223  Progress: 4456 on 6223  Progress: 4457 on 6223  Progress: 4458 on 6223  Progress: 4459 on 6223  Progress: 4460 on 6223  Progress: 4461 on 6223  Progress: 4462 on 6223  Progress: 4463 on 6223  Progress: 4464 on 6223  Progress: 4465 on 6223  Progress: 4466 on 6223  Progress: 4467 on 6223  Progress: 4468 on 6223  Progress: 4469 on 6223  Progress: 4470 on 6223  Progress: 4471 on 6223  Progress: 4472 on 6223  Progress: 4473 on 6223  Progress: 4474 on 6223  Progress: 4475 on 6223  Progress: 4476 on 6223  Progress: 4477 on 6223  Progress: 4478 on 6223  Progress: 4479 on 6223  Progress: 4480 on 6223  Progress: 4481 on 6223  Progress: 4482 on 6223  Progress: 4483 on 6223  Progress: 4484 on 6223  Progress: 4485 on 6223  Progress: 4486 on 6223  Progress: 4487 on 6223  Progress: 4488 on 6223  Progress: 4489 on 6223  Progress: 4490 on 6223  Progress: 4491 on 6223  Progress: 4492 on 6223  Progress: 4493 on 6223  Progress: 4494 on 6223  Progress: 4495 on 6223  Progress: 4496 on 6223  Progress: 4497 on 6223  Progress: 4498 on 6223  Progress: 4499 on 6223  Progress: 4500 on 6223  Progress: 4501 on 6223  Progress: 4502 on 6223  Progress: 4503 on 6223  Progress: 4504 on 6223  Progress: 4505 on 6223  Progress: 4506 on 6223  Progress: 4507 on 6223  Progress: 4508 on 6223  Progress: 4509 on 6223  Progress: 4510 on 6223  Progress: 4511 on 6223  Progress: 4512 on 6223  Progress: 4513 on 6223  Progress: 4514 on 6223  Progress: 4515 on 6223  Progress: 4516 on 6223  Progress: 4517 on 6223  Progress: 4518 on 6223  Progress: 4519 on 6223  Progress: 4520 on 6223  Progress: 4521 on 6223  Progress: 4522 on 6223  Progress: 4523 on 6223  Progress: 4524 on 6223  Progress: 4525 on 6223  Progress: 4526 on 6223  Progress: 4527 on 6223  Progress: 4528 on 6223  Progress: 4529 on 6223  Progress: 4530 on 6223  Progress: 4531 on 6223  Progress: 4532 on 6223  Progress: 4533 on 6223  Progress: 4534 on 6223  Progress: 4535 on 6223  Progress: 4536 on 6223  Progress: 4537 on 6223  Progress: 4538 on 6223  Progress: 4539 on 6223  Progress: 4540 on 6223  Progress: 4541 on 6223  Progress: 4542 on 6223  Progress: 4543 on 6223  Progress: 4544 on 6223  Progress: 4545 on 6223  Progress: 4546 on 6223  Progress: 4547 on 6223  Progress: 4548 on 6223  Progress: 4549 on 6223  Progress: 4550 on 6223  Progress: 4551 on 6223  Progress: 4552 on 6223  Progress: 4553 on 6223  Progress: 4554 on 6223  Progress: 4555 on 6223  Progress: 4556 on 6223  Progress: 4557 on 6223  Progress: 4558 on 6223  Progress: 4559 on 6223  Progress: 4560 on 6223  Progress: 4561 on 6223  Progress: 4562 on 6223  Progress: 4563 on 6223  Progress: 4564 on 6223  Progress: 4565 on 6223  Progress: 4566 on 6223  Progress: 4567 on 6223  Progress: 4568 on 6223  Progress: 4569 on 6223  Progress: 4570 on 6223  Progress: 4571 on 6223  Progress: 4572 on 6223  Progress: 4573 on 6223  Progress: 4574 on 6223  Progress: 4575 on 6223  Progress: 4576 on 6223  Progress: 4577 on 6223  Progress: 4578 on 6223  Progress: 4579 on 6223  Progress: 4580 on 6223  Progress: 4581 on 6223  Progress: 4582 on 6223  Progress: 4583 on 6223  Progress: 4584 on 6223  Progress: 4585 on 6223  Progress: 4586 on 6223  Progress: 4587 on 6223  Progress: 4588 on 6223  Progress: 4589 on 6223  Progress: 4590 on 6223  Progress: 4591 on 6223  Progress: 4592 on 6223  Progress: 4593 on 6223  Progress: 4594 on 6223  Progress: 4595 on 6223  Progress: 4596 on 6223  Progress: 4597 on 6223  Progress: 4598 on 6223  Progress: 4599 on 6223  Progress: 4600 on 6223  Progress: 4601 on 6223  Progress: 4602 on 6223  Progress: 4603 on 6223  Progress: 4604 on 6223  Progress: 4605 on 6223  Progress: 4606 on 6223  Progress: 4607 on 6223  Progress: 4608 on 6223  Progress: 4609 on 6223  Progress: 4610 on 6223  Progress: 4611 on 6223  Progress: 4612 on 6223  Progress: 4613 on 6223  Progress: 4614 on 6223  Progress: 4615 on 6223  Progress: 4616 on 6223  Progress: 4617 on 6223  Progress: 4618 on 6223  Progress: 4619 on 6223  Progress: 4620 on 6223  Progress: 4621 on 6223  Progress: 4622 on 6223  Progress: 4623 on 6223  Progress: 4624 on 6223  Progress: 4625 on 6223  Progress: 4626 on 6223  Progress: 4627 on 6223  Progress: 4628 on 6223  Progress: 4629 on 6223  Progress: 4630 on 6223  Progress: 4631 on 6223  Progress: 4632 on 6223  Progress: 4633 on 6223  Progress: 4634 on 6223  Progress: 4635 on 6223  Progress: 4636 on 6223  Progress: 4637 on 6223  Progress: 4638 on 6223  Progress: 4639 on 6223  Progress: 4640 on 6223  Progress: 4641 on 6223  Progress: 4642 on 6223  Progress: 4643 on 6223  Progress: 4644 on 6223  Progress: 4645 on 6223  Progress: 4646 on 6223  Progress: 4647 on 6223  Progress: 4648 on 6223  Progress: 4649 on 6223  Progress: 4650 on 6223  Progress: 4651 on 6223  Progress: 4652 on 6223  Progress: 4653 on 6223  Progress: 4654 on 6223  Progress: 4655 on 6223  Progress: 4656 on 6223  Progress: 4657 on 6223  Progress: 4658 on 6223  Progress: 4659 on 6223  Progress: 4660 on 6223  Progress: 4661 on 6223  Progress: 4662 on 6223  Progress: 4663 on 6223  Progress: 4664 on 6223  Progress: 4665 on 6223  Progress: 4666 on 6223  Progress: 4667 on 6223  Progress: 4668 on 6223  Progress: 4669 on 6223  Progress: 4670 on 6223  Progress: 4671 on 6223  Progress: 4672 on 6223  Progress: 4673 on 6223  Progress: 4674 on 6223  Progress: 4675 on 6223  Progress: 4676 on 6223  Progress: 4677 on 6223  Progress: 4678 on 6223  Progress: 4679 on 6223  Progress: 4680 on 6223  Progress: 4681 on 6223  Progress: 4682 on 6223  Progress: 4683 on 6223  Progress: 4684 on 6223  Progress: 4685 on 6223  Progress: 4686 on 6223  Progress: 4687 on 6223  Progress: 4688 on 6223  Progress: 4689 on 6223  Progress: 4690 on 6223  Progress: 4691 on 6223  Progress: 4692 on 6223  Progress: 4693 on 6223  Progress: 4694 on 6223  Progress: 4695 on 6223  Progress: 4696 on 6223  Progress: 4697 on 6223  Progress: 4698 on 6223  Progress: 4699 on 6223  Progress: 4700 on 6223  Progress: 4701 on 6223  Progress: 4702 on 6223  Progress: 4703 on 6223  Progress: 4704 on 6223  Progress: 4705 on 6223  Progress: 4706 on 6223  Progress: 4707 on 6223  Progress: 4708 on 6223  Progress: 4709 on 6223  Progress: 4710 on 6223  Progress: 4711 on 6223  Progress: 4712 on 6223  Progress: 4713 on 6223  Progress: 4714 on 6223  Progress: 4715 on 6223  Progress: 4716 on 6223  Progress: 4717 on 6223  Progress: 4718 on 6223  Progress: 4719 on 6223  Progress: 4720 on 6223  Progress: 4721 on 6223  Progress: 4722 on 6223  Progress: 4723 on 6223  Progress: 4724 on 6223  Progress: 4725 on 6223  Progress: 4726 on 6223  Progress: 4727 on 6223  Progress: 4728 on 6223  Progress: 4729 on 6223  Progress: 4730 on 6223  Progress: 4731 on 6223  Progress: 4732 on 6223  Progress: 4733 on 6223  Progress: 4734 on 6223  Progress: 4735 on 6223  Progress: 4736 on 6223  Progress: 4737 on 6223  Progress: 4738 on 6223  Progress: 4739 on 6223  Progress: 4740 on 6223  Progress: 4741 on 6223  Progress: 4742 on 6223  Progress: 4743 on 6223  Progress: 4744 on 6223  Progress: 4745 on 6223  Progress: 4746 on 6223  Progress: 4747 on 6223  Progress: 4748 on 6223  Progress: 4749 on 6223  Progress: 4750 on 6223  Progress: 4751 on 6223  Progress: 4752 on 6223  Progress: 4753 on 6223  Progress: 4754 on 6223  Progress: 4755 on 6223  Progress: 4756 on 6223  Progress: 4757 on 6223  Progress: 4758 on 6223  Progress: 4759 on 6223  Progress: 4760 on 6223  Progress: 4761 on 6223  Progress: 4762 on 6223  Progress: 4763 on 6223  Progress: 4764 on 6223  Progress: 4765 on 6223  Progress: 4766 on 6223  Progress: 4767 on 6223  Progress: 4768 on 6223  Progress: 4769 on 6223  Progress: 4770 on 6223  Progress: 4771 on 6223  Progress: 4772 on 6223  Progress: 4773 on 6223  Progress: 4774 on 6223  Progress: 4775 on 6223  Progress: 4776 on 6223  Progress: 4777 on 6223  Progress: 4778 on 6223  Progress: 4779 on 6223  Progress: 4780 on 6223  Progress: 4781 on 6223  Progress: 4782 on 6223  Progress: 4783 on 6223  Progress: 4784 on 6223  Progress: 4785 on 6223  Progress: 4786 on 6223  Progress: 4787 on 6223  Progress: 4788 on 6223  Progress: 4789 on 6223  Progress: 4790 on 6223  Progress: 4791 on 6223  Progress: 4792 on 6223  Progress: 4793 on 6223  Progress: 4794 on 6223  Progress: 4795 on 6223  Progress: 4796 on 6223  Progress: 4797 on 6223  Progress: 4798 on 6223  Progress: 4799 on 6223  Progress: 4800 on 6223  Progress: 4801 on 6223  Progress: 4802 on 6223  Progress: 4803 on 6223  Progress: 4804 on 6223  Progress: 4805 on 6223  Progress: 4806 on 6223  Progress: 4807 on 6223  Progress: 4808 on 6223  Progress: 4809 on 6223  Progress: 4810 on 6223  Progress: 4811 on 6223  Progress: 4812 on 6223  Progress: 4813 on 6223  Progress: 4814 on 6223  Progress: 4815 on 6223  Progress: 4816 on 6223  Progress: 4817 on 6223  Progress: 4818 on 6223  Progress: 4819 on 6223  Progress: 4820 on 6223  Progress: 4821 on 6223  Progress: 4822 on 6223  Progress: 4823 on 6223  Progress: 4824 on 6223  Progress: 4825 on 6223  Progress: 4826 on 6223  Progress: 4827 on 6223  Progress: 4828 on 6223  Progress: 4829 on 6223  Progress: 4830 on 6223  Progress: 4831 on 6223  Progress: 4832 on 6223  Progress: 4833 on 6223  Progress: 4834 on 6223  Progress: 4835 on 6223  Progress: 4836 on 6223  Progress: 4837 on 6223  Progress: 4838 on 6223  Progress: 4839 on 6223  Progress: 4840 on 6223  Progress: 4841 on 6223  Progress: 4842 on 6223  Progress: 4843 on 6223  Progress: 4844 on 6223  Progress: 4845 on 6223  Progress: 4846 on 6223  Progress: 4847 on 6223  Progress: 4848 on 6223  Progress: 4849 on 6223  Progress: 4850 on 6223  Progress: 4851 on 6223  Progress: 4852 on 6223  Progress: 4853 on 6223  Progress: 4854 on 6223  Progress: 4855 on 6223  Progress: 4856 on 6223  Progress: 4857 on 6223  Progress: 4858 on 6223  Progress: 4859 on 6223  Progress: 4860 on 6223  Progress: 4861 on 6223  Progress: 4862 on 6223  Progress: 4863 on 6223  Progress: 4864 on 6223  Progress: 4865 on 6223  Progress: 4866 on 6223  Progress: 4867 on 6223  Progress: 4868 on 6223  Progress: 4869 on 6223  Progress: 4870 on 6223  Progress: 4871 on 6223  Progress: 4872 on 6223  Progress: 4873 on 6223  Progress: 4874 on 6223  Progress: 4875 on 6223  Progress: 4876 on 6223  Progress: 4877 on 6223  Progress: 4878 on 6223  Progress: 4879 on 6223  Progress: 4880 on 6223  Progress: 4881 on 6223  Progress: 4882 on 6223  Progress: 4883 on 6223  Progress: 4884 on 6223  Progress: 4885 on 6223  Progress: 4886 on 6223  Progress: 4887 on 6223  Progress: 4888 on 6223  Progress: 4889 on 6223  Progress: 4890 on 6223  Progress: 4891 on 6223  Progress: 4892 on 6223  Progress: 4893 on 6223  Progress: 4894 on 6223  Progress: 4895 on 6223  Progress: 4896 on 6223  Progress: 4897 on 6223  Progress: 4898 on 6223  Progress: 4899 on 6223  Progress: 4900 on 6223  Progress: 4901 on 6223  Progress: 4902 on 6223  Progress: 4903 on 6223  Progress: 4904 on 6223  Progress: 4905 on 6223  Progress: 4906 on 6223  Progress: 4907 on 6223  Progress: 4908 on 6223  Progress: 4909 on 6223  Progress: 4910 on 6223  Progress: 4911 on 6223  Progress: 4912 on 6223  Progress: 4913 on 6223  Progress: 4914 on 6223  Progress: 4915 on 6223  Progress: 4916 on 6223  Progress: 4917 on 6223  Progress: 4918 on 6223  Progress: 4919 on 6223  Progress: 4920 on 6223  Progress: 4921 on 6223  Progress: 4922 on 6223  Progress: 4923 on 6223  Progress: 4924 on 6223  Progress: 4925 on 6223  Progress: 4926 on 6223  Progress: 4927 on 6223  Progress: 4928 on 6223  Progress: 4929 on 6223  Progress: 4930 on 6223  Progress: 4931 on 6223  Progress: 4932 on 6223  Progress: 4933 on 6223  Progress: 4934 on 6223  Progress: 4935 on 6223  Progress: 4936 on 6223  Progress: 4937 on 6223  Progress: 4938 on 6223  Progress: 4939 on 6223  Progress: 4940 on 6223  Progress: 4941 on 6223  Progress: 4942 on 6223  Progress: 4943 on 6223  Progress: 4944 on 6223  Progress: 4945 on 6223  Progress: 4946 on 6223  Progress: 4947 on 6223  Progress: 4948 on 6223  Progress: 4949 on 6223  Progress: 4950 on 6223  Progress: 4951 on 6223  Progress: 4952 on 6223  Progress: 4953 on 6223  Progress: 4954 on 6223  Progress: 4955 on 6223  Progress: 4956 on 6223  Progress: 4957 on 6223  Progress: 4958 on 6223  Progress: 4959 on 6223  Progress: 4960 on 6223  Progress: 4961 on 6223  Progress: 4962 on 6223  Progress: 4963 on 6223  Progress: 4964 on 6223  Progress: 4965 on 6223  Progress: 4966 on 6223  Progress: 4967 on 6223  Progress: 4968 on 6223  Progress: 4969 on 6223  Progress: 4970 on 6223  Progress: 4971 on 6223  Progress: 4972 on 6223  Progress: 4973 on 6223  Progress: 4974 on 6223  Progress: 4975 on 6223  Progress: 4976 on 6223  Progress: 4977 on 6223  Progress: 4978 on 6223  Progress: 4979 on 6223  Progress: 4980 on 6223  Progress: 4981 on 6223  Progress: 4982 on 6223  Progress: 4983 on 6223  Progress: 4984 on 6223  Progress: 4985 on 6223  Progress: 4986 on 6223  Progress: 4987 on 6223  Progress: 4988 on 6223  Progress: 4989 on 6223  Progress: 4990 on 6223  Progress: 4991 on 6223  Progress: 4992 on 6223  Progress: 4993 on 6223  Progress: 4994 on 6223  Progress: 4995 on 6223  Progress: 4996 on 6223  Progress: 4997 on 6223  Progress: 4998 on 6223  Progress: 4999 on 6223  Progress: 5000 on 6223  Progress: 5001 on 6223  Progress: 5002 on 6223  Progress: 5003 on 6223  Progress: 5004 on 6223  Progress: 5005 on 6223  Progress: 5006 on 6223  Progress: 5007 on 6223  Progress: 5008 on 6223  Progress: 5009 on 6223  Progress: 5010 on 6223  Progress: 5011 on 6223  Progress: 5012 on 6223  Progress: 5013 on 6223  Progress: 5014 on 6223  Progress: 5015 on 6223  Progress: 5016 on 6223  Progress: 5017 on 6223  Progress: 5018 on 6223  Progress: 5019 on 6223  Progress: 5020 on 6223  Progress: 5021 on 6223  Progress: 5022 on 6223  Progress: 5023 on 6223  Progress: 5024 on 6223  Progress: 5025 on 6223  Progress: 5026 on 6223  Progress: 5027 on 6223  Progress: 5028 on 6223  Progress: 5029 on 6223  Progress: 5030 on 6223  Progress: 5031 on 6223  Progress: 5032 on 6223  Progress: 5033 on 6223  Progress: 5034 on 6223  Progress: 5035 on 6223  Progress: 5036 on 6223  Progress: 5037 on 6223  Progress: 5038 on 6223  Progress: 5039 on 6223  Progress: 5040 on 6223  Progress: 5041 on 6223  Progress: 5042 on 6223  Progress: 5043 on 6223  Progress: 5044 on 6223  Progress: 5045 on 6223  Progress: 5046 on 6223  Progress: 5047 on 6223  Progress: 5048 on 6223  Progress: 5049 on 6223  Progress: 5050 on 6223  Progress: 5051 on 6223  Progress: 5052 on 6223  Progress: 5053 on 6223  Progress: 5054 on 6223  Progress: 5055 on 6223  Progress: 5056 on 6223  Progress: 5057 on 6223  Progress: 5058 on 6223  Progress: 5059 on 6223  Progress: 5060 on 6223  Progress: 5061 on 6223  Progress: 5062 on 6223  Progress: 5063 on 6223  Progress: 5064 on 6223  Progress: 5065 on 6223  Progress: 5066 on 6223  Progress: 5067 on 6223  Progress: 5068 on 6223  Progress: 5069 on 6223  Progress: 5070 on 6223  Progress: 5071 on 6223  Progress: 5072 on 6223  Progress: 5073 on 6223  Progress: 5074 on 6223  Progress: 5075 on 6223  Progress: 5076 on 6223  Progress: 5077 on 6223  Progress: 5078 on 6223  Progress: 5079 on 6223  Progress: 5080 on 6223  Progress: 5081 on 6223  Progress: 5082 on 6223  Progress: 5083 on 6223  Progress: 5084 on 6223  Progress: 5085 on 6223  Progress: 5086 on 6223  Progress: 5087 on 6223  Progress: 5088 on 6223  Progress: 5089 on 6223  Progress: 5090 on 6223  Progress: 5091 on 6223  Progress: 5092 on 6223  Progress: 5093 on 6223  Progress: 5094 on 6223  Progress: 5095 on 6223  Progress: 5096 on 6223  Progress: 5097 on 6223  Progress: 5098 on 6223  Progress: 5099 on 6223  Progress: 5100 on 6223  Progress: 5101 on 6223  Progress: 5102 on 6223  Progress: 5103 on 6223  Progress: 5104 on 6223  Progress: 5105 on 6223  Progress: 5106 on 6223  Progress: 5107 on 6223  Progress: 5108 on 6223  Progress: 5109 on 6223  Progress: 5110 on 6223  Progress: 5111 on 6223  Progress: 5112 on 6223  Progress: 5113 on 6223  Progress: 5114 on 6223  Progress: 5115 on 6223  Progress: 5116 on 6223  Progress: 5117 on 6223  Progress: 5118 on 6223  Progress: 5119 on 6223  Progress: 5120 on 6223  Progress: 5121 on 6223  Progress: 5122 on 6223  Progress: 5123 on 6223  Progress: 5124 on 6223  Progress: 5125 on 6223  Progress: 5126 on 6223  Progress: 5127 on 6223  Progress: 5128 on 6223  Progress: 5129 on 6223  Progress: 5130 on 6223  Progress: 5131 on 6223  Progress: 5132 on 6223  Progress: 5133 on 6223  Progress: 5134 on 6223  Progress: 5135 on 6223  Progress: 5136 on 6223  Progress: 5137 on 6223  Progress: 5138 on 6223  Progress: 5139 on 6223  Progress: 5140 on 6223  Progress: 5141 on 6223  Progress: 5142 on 6223  Progress: 5143 on 6223  Progress: 5144 on 6223  Progress: 5145 on 6223  Progress: 5146 on 6223  Progress: 5147 on 6223  Progress: 5148 on 6223  Progress: 5149 on 6223  Progress: 5150 on 6223  Progress: 5151 on 6223  Progress: 5152 on 6223  Progress: 5153 on 6223  Progress: 5154 on 6223  Progress: 5155 on 6223  Progress: 5156 on 6223  Progress: 5157 on 6223  Progress: 5158 on 6223  Progress: 5159 on 6223  Progress: 5160 on 6223  Progress: 5161 on 6223  Progress: 5162 on 6223  Progress: 5163 on 6223  Progress: 5164 on 6223  Progress: 5165 on 6223  Progress: 5166 on 6223  Progress: 5167 on 6223  Progress: 5168 on 6223  Progress: 5169 on 6223  Progress: 5170 on 6223  Progress: 5171 on 6223  Progress: 5172 on 6223  Progress: 5173 on 6223  Progress: 5174 on 6223  Progress: 5175 on 6223  Progress: 5176 on 6223  Progress: 5177 on 6223  Progress: 5178 on 6223  Progress: 5179 on 6223  Progress: 5180 on 6223  Progress: 5181 on 6223  Progress: 5182 on 6223  Progress: 5183 on 6223  Progress: 5184 on 6223  Progress: 5185 on 6223  Progress: 5186 on 6223  Progress: 5187 on 6223  Progress: 5188 on 6223  Progress: 5189 on 6223  Progress: 5190 on 6223  Progress: 5191 on 6223  Progress: 5192 on 6223  Progress: 5193 on 6223  Progress: 5194 on 6223  Progress: 5195 on 6223  Progress: 5196 on 6223  Progress: 5197 on 6223  Progress: 5198 on 6223  Progress: 5199 on 6223  Progress: 5200 on 6223  Progress: 5201 on 6223  Progress: 5202 on 6223  Progress: 5203 on 6223  Progress: 5204 on 6223  Progress: 5205 on 6223  Progress: 5206 on 6223  Progress: 5207 on 6223  Progress: 5208 on 6223  Progress: 5209 on 6223  Progress: 5210 on 6223  Progress: 5211 on 6223  Progress: 5212 on 6223  Progress: 5213 on 6223  Progress: 5214 on 6223  Progress: 5215 on 6223  Progress: 5216 on 6223  Progress: 5217 on 6223  Progress: 5218 on 6223  Progress: 5219 on 6223  Progress: 5220 on 6223  Progress: 5221 on 6223  Progress: 5222 on 6223  Progress: 5223 on 6223  Progress: 5224 on 6223  Progress: 5225 on 6223  Progress: 5226 on 6223  Progress: 5227 on 6223  Progress: 5228 on 6223  Progress: 5229 on 6223  Progress: 5230 on 6223  Progress: 5231 on 6223  Progress: 5232 on 6223  Progress: 5233 on 6223  Progress: 5234 on 6223  Progress: 5235 on 6223  Progress: 5236 on 6223  Progress: 5237 on 6223  Progress: 5238 on 6223  Progress: 5239 on 6223  Progress: 5240 on 6223  Progress: 5241 on 6223  Progress: 5242 on 6223  Progress: 5243 on 6223  Progress: 5244 on 6223  Progress: 5245 on 6223  Progress: 5246 on 6223  Progress: 5247 on 6223  Progress: 5248 on 6223  Progress: 5249 on 6223  Progress: 5250 on 6223  Progress: 5251 on 6223  Progress: 5252 on 6223  Progress: 5253 on 6223  Progress: 5254 on 6223  Progress: 5255 on 6223  Progress: 5256 on 6223  Progress: 5257 on 6223  Progress: 5258 on 6223  Progress: 5259 on 6223  Progress: 5260 on 6223  Progress: 5261 on 6223  Progress: 5262 on 6223  Progress: 5263 on 6223  Progress: 5264 on 6223  Progress: 5265 on 6223  Progress: 5266 on 6223  Progress: 5267 on 6223  Progress: 5268 on 6223  Progress: 5269 on 6223  Progress: 5270 on 6223  Progress: 5271 on 6223  Progress: 5272 on 6223  Progress: 5273 on 6223  Progress: 5274 on 6223  Progress: 5275 on 6223  Progress: 5276 on 6223  Progress: 5277 on 6223  Progress: 5278 on 6223  Progress: 5279 on 6223  Progress: 5280 on 6223  Progress: 5281 on 6223  Progress: 5282 on 6223  Progress: 5283 on 6223  Progress: 5284 on 6223  Progress: 5285 on 6223  Progress: 5286 on 6223  Progress: 5287 on 6223  Progress: 5288 on 6223  Progress: 5289 on 6223  Progress: 5290 on 6223  Progress: 5291 on 6223  Progress: 5292 on 6223  Progress: 5293 on 6223  Progress: 5294 on 6223  Progress: 5295 on 6223  Progress: 5296 on 6223  Progress: 5297 on 6223  Progress: 5298 on 6223  Progress: 5299 on 6223  Progress: 5300 on 6223  Progress: 5301 on 6223  Progress: 5302 on 6223  Progress: 5303 on 6223  Progress: 5304 on 6223  Progress: 5305 on 6223  Progress: 5306 on 6223  Progress: 5307 on 6223  Progress: 5308 on 6223  Progress: 5309 on 6223  Progress: 5310 on 6223  Progress: 5311 on 6223  Progress: 5312 on 6223  Progress: 5313 on 6223  Progress: 5314 on 6223  Progress: 5315 on 6223  Progress: 5316 on 6223  Progress: 5317 on 6223  Progress: 5318 on 6223  Progress: 5319 on 6223  Progress: 5320 on 6223  Progress: 5321 on 6223  Progress: 5322 on 6223  Progress: 5323 on 6223  Progress: 5324 on 6223  Progress: 5325 on 6223  Progress: 5326 on 6223  Progress: 5327 on 6223  Progress: 5328 on 6223  Progress: 5329 on 6223  Progress: 5330 on 6223  Progress: 5331 on 6223  Progress: 5332 on 6223  Progress: 5333 on 6223  Progress: 5334 on 6223  Progress: 5335 on 6223  Progress: 5336 on 6223  Progress: 5337 on 6223  Progress: 5338 on 6223  Progress: 5339 on 6223  Progress: 5340 on 6223  Progress: 5341 on 6223  Progress: 5342 on 6223  Progress: 5343 on 6223  Progress: 5344 on 6223  Progress: 5345 on 6223  Progress: 5346 on 6223  Progress: 5347 on 6223  Progress: 5348 on 6223  Progress: 5349 on 6223  Progress: 5350 on 6223  Progress: 5351 on 6223  Progress: 5352 on 6223  Progress: 5353 on 6223  Progress: 5354 on 6223  Progress: 5355 on 6223  Progress: 5356 on 6223  Progress: 5357 on 6223  Progress: 5358 on 6223  Progress: 5359 on 6223  Progress: 5360 on 6223  Progress: 5361 on 6223  Progress: 5362 on 6223  Progress: 5363 on 6223  Progress: 5364 on 6223  Progress: 5365 on 6223  Progress: 5366 on 6223  Progress: 5367 on 6223  Progress: 5368 on 6223  Progress: 5369 on 6223  Progress: 5370 on 6223  Progress: 5371 on 6223  Progress: 5372 on 6223  Progress: 5373 on 6223  Progress: 5374 on 6223  Progress: 5375 on 6223  Progress: 5376 on 6223  Progress: 5377 on 6223  Progress: 5378 on 6223  Progress: 5379 on 6223  Progress: 5380 on 6223  Progress: 5381 on 6223  Progress: 5382 on 6223  Progress: 5383 on 6223  Progress: 5384 on 6223  Progress: 5385 on 6223  Progress: 5386 on 6223  Progress: 5387 on 6223  Progress: 5388 on 6223  Progress: 5389 on 6223  Progress: 5390 on 6223  Progress: 5391 on 6223  Progress: 5392 on 6223  Progress: 5393 on 6223  Progress: 5394 on 6223  Progress: 5395 on 6223  Progress: 5396 on 6223  Progress: 5397 on 6223  Progress: 5398 on 6223  Progress: 5399 on 6223  Progress: 5400 on 6223  Progress: 5401 on 6223  Progress: 5402 on 6223  Progress: 5403 on 6223  Progress: 5404 on 6223  Progress: 5405 on 6223  Progress: 5406 on 6223  Progress: 5407 on 6223  Progress: 5408 on 6223  Progress: 5409 on 6223  Progress: 5410 on 6223  Progress: 5411 on 6223  Progress: 5412 on 6223  Progress: 5413 on 6223  Progress: 5414 on 6223  Progress: 5415 on 6223  Progress: 5416 on 6223  Progress: 5417 on 6223  Progress: 5418 on 6223  Progress: 5419 on 6223  Progress: 5420 on 6223  Progress: 5421 on 6223  Progress: 5422 on 6223  Progress: 5423 on 6223  Progress: 5424 on 6223  Progress: 5425 on 6223  Progress: 5426 on 6223  Progress: 5427 on 6223  Progress: 5428 on 6223  Progress: 5429 on 6223  Progress: 5430 on 6223  Progress: 5431 on 6223  Progress: 5432 on 6223  Progress: 5433 on 6223  Progress: 5434 on 6223  Progress: 5435 on 6223  Progress: 5436 on 6223  Progress: 5437 on 6223  Progress: 5438 on 6223  Progress: 5439 on 6223  Progress: 5440 on 6223  Progress: 5441 on 6223  Progress: 5442 on 6223  Progress: 5443 on 6223  Progress: 5444 on 6223  Progress: 5445 on 6223  Progress: 5446 on 6223  Progress: 5447 on 6223  Progress: 5448 on 6223  Progress: 5449 on 6223  Progress: 5450 on 6223  Progress: 5451 on 6223  Progress: 5452 on 6223  Progress: 5453 on 6223  Progress: 5454 on 6223  Progress: 5455 on 6223  Progress: 5456 on 6223  Progress: 5457 on 6223  Progress: 5458 on 6223  Progress: 5459 on 6223  Progress: 5460 on 6223  Progress: 5461 on 6223  Progress: 5462 on 6223  Progress: 5463 on 6223  Progress: 5464 on 6223  Progress: 5465 on 6223  Progress: 5466 on 6223  Progress: 5467 on 6223  Progress: 5468 on 6223  Progress: 5469 on 6223  Progress: 5470 on 6223  Progress: 5471 on 6223  Progress: 5472 on 6223  Progress: 5473 on 6223  Progress: 5474 on 6223  Progress: 5475 on 6223  Progress: 5476 on 6223  Progress: 5477 on 6223  Progress: 5478 on 6223  Progress: 5479 on 6223  Progress: 5480 on 6223  Progress: 5481 on 6223  Progress: 5482 on 6223  Progress: 5483 on 6223  Progress: 5484 on 6223  Progress: 5485 on 6223  Progress: 5486 on 6223  Progress: 5487 on 6223  Progress: 5488 on 6223  Progress: 5489 on 6223  Progress: 5490 on 6223  Progress: 5491 on 6223  Progress: 5492 on 6223  Progress: 5493 on 6223  Progress: 5494 on 6223  Progress: 5495 on 6223  Progress: 5496 on 6223  Progress: 5497 on 6223  Progress: 5498 on 6223  Progress: 5499 on 6223  Progress: 5500 on 6223  Progress: 5501 on 6223  Progress: 5502 on 6223  Progress: 5503 on 6223  Progress: 5504 on 6223  Progress: 5505 on 6223  Progress: 5506 on 6223  Progress: 5507 on 6223  Progress: 5508 on 6223  Progress: 5509 on 6223  Progress: 5510 on 6223  Progress: 5511 on 6223  Progress: 5512 on 6223  Progress: 5513 on 6223  Progress: 5514 on 6223  Progress: 5515 on 6223  Progress: 5516 on 6223  Progress: 5517 on 6223  Progress: 5518 on 6223  Progress: 5519 on 6223  Progress: 5520 on 6223  Progress: 5521 on 6223  Progress: 5522 on 6223  Progress: 5523 on 6223  Progress: 5524 on 6223  Progress: 5525 on 6223  Progress: 5526 on 6223  Progress: 5527 on 6223  Progress: 5528 on 6223  Progress: 5529 on 6223  Progress: 5530 on 6223  Progress: 5531 on 6223  Progress: 5532 on 6223  Progress: 5533 on 6223  Progress: 5534 on 6223  Progress: 5535 on 6223  Progress: 5536 on 6223  Progress: 5537 on 6223  Progress: 5538 on 6223  Progress: 5539 on 6223  Progress: 5540 on 6223  Progress: 5541 on 6223  Progress: 5542 on 6223  Progress: 5543 on 6223  Progress: 5544 on 6223  Progress: 5545 on 6223  Progress: 5546 on 6223  Progress: 5547 on 6223  Progress: 5548 on 6223  Progress: 5549 on 6223  Progress: 5550 on 6223  Progress: 5551 on 6223  Progress: 5552 on 6223  Progress: 5553 on 6223  Progress: 5554 on 6223  Progress: 5555 on 6223  Progress: 5556 on 6223  Progress: 5557 on 6223  Progress: 5558 on 6223  Progress: 5559 on 6223  Progress: 5560 on 6223  Progress: 5561 on 6223  Progress: 5562 on 6223  Progress: 5563 on 6223  Progress: 5564 on 6223  Progress: 5565 on 6223  Progress: 5566 on 6223  Progress: 5567 on 6223  Progress: 5568 on 6223  Progress: 5569 on 6223  Progress: 5570 on 6223  Progress: 5571 on 6223  Progress: 5572 on 6223  Progress: 5573 on 6223  Progress: 5574 on 6223  Progress: 5575 on 6223  Progress: 5576 on 6223  Progress: 5577 on 6223  Progress: 5578 on 6223  Progress: 5579 on 6223  Progress: 5580 on 6223  Progress: 5581 on 6223  Progress: 5582 on 6223  Progress: 5583 on 6223  Progress: 5584 on 6223  Progress: 5585 on 6223  Progress: 5586 on 6223  Progress: 5587 on 6223  Progress: 5588 on 6223  Progress: 5589 on 6223  Progress: 5590 on 6223  Progress: 5591 on 6223  Progress: 5592 on 6223  Progress: 5593 on 6223  Progress: 5594 on 6223  Progress: 5595 on 6223  Progress: 5596 on 6223  Progress: 5597 on 6223  Progress: 5598 on 6223  Progress: 5599 on 6223  Progress: 5600 on 6223  Progress: 5601 on 6223  Progress: 5602 on 6223  Progress: 5603 on 6223  Progress: 5604 on 6223  Progress: 5605 on 6223  Progress: 5606 on 6223  Progress: 5607 on 6223  Progress: 5608 on 6223  Progress: 5609 on 6223  Progress: 5610 on 6223  Progress: 5611 on 6223  Progress: 5612 on 6223  Progress: 5613 on 6223  Progress: 5614 on 6223  Progress: 5615 on 6223  Progress: 5616 on 6223  Progress: 5617 on 6223  Progress: 5618 on 6223  Progress: 5619 on 6223  Progress: 5620 on 6223  Progress: 5621 on 6223  Progress: 5622 on 6223  Progress: 5623 on 6223  Progress: 5624 on 6223  Progress: 5625 on 6223  Progress: 5626 on 6223  Progress: 5627 on 6223  Progress: 5628 on 6223  Progress: 5629 on 6223  Progress: 5630 on 6223  Progress: 5631 on 6223  Progress: 5632 on 6223  Progress: 5633 on 6223  Progress: 5634 on 6223  Progress: 5635 on 6223  Progress: 5636 on 6223  Progress: 5637 on 6223  Progress: 5638 on 6223  Progress: 5639 on 6223  Progress: 5640 on 6223  Progress: 5641 on 6223  Progress: 5642 on 6223  Progress: 5643 on 6223  Progress: 5644 on 6223  Progress: 5645 on 6223  Progress: 5646 on 6223  Progress: 5647 on 6223  Progress: 5648 on 6223  Progress: 5649 on 6223  Progress: 5650 on 6223  Progress: 5651 on 6223  Progress: 5652 on 6223  Progress: 5653 on 6223  Progress: 5654 on 6223  Progress: 5655 on 6223  Progress: 5656 on 6223  Progress: 5657 on 6223  Progress: 5658 on 6223  Progress: 5659 on 6223  Progress: 5660 on 6223  Progress: 5661 on 6223  Progress: 5662 on 6223  Progress: 5663 on 6223  Progress: 5664 on 6223  Progress: 5665 on 6223  Progress: 5666 on 6223  Progress: 5667 on 6223  Progress: 5668 on 6223  Progress: 5669 on 6223  Progress: 5670 on 6223  Progress: 5671 on 6223  Progress: 5672 on 6223  Progress: 5673 on 6223  Progress: 5674 on 6223  Progress: 5675 on 6223  Progress: 5676 on 6223  Progress: 5677 on 6223  Progress: 5678 on 6223  Progress: 5679 on 6223  Progress: 5680 on 6223  Progress: 5681 on 6223  Progress: 5682 on 6223  Progress: 5683 on 6223  Progress: 5684 on 6223  Progress: 5685 on 6223  Progress: 5686 on 6223  Progress: 5687 on 6223  Progress: 5688 on 6223  Progress: 5689 on 6223  Progress: 5690 on 6223  Progress: 5691 on 6223  Progress: 5692 on 6223  Progress: 5693 on 6223  Progress: 5694 on 6223  Progress: 5695 on 6223  Progress: 5696 on 6223  Progress: 5697 on 6223  Progress: 5698 on 6223  Progress: 5699 on 6223  Progress: 5700 on 6223  Progress: 5701 on 6223  Progress: 5702 on 6223  Progress: 5703 on 6223  Progress: 5704 on 6223  Progress: 5705 on 6223  Progress: 5706 on 6223  Progress: 5707 on 6223  Progress: 5708 on 6223  Progress: 5709 on 6223  Progress: 5710 on 6223  Progress: 5711 on 6223  Progress: 5712 on 6223  Progress: 5713 on 6223  Progress: 5714 on 6223  Progress: 5715 on 6223  Progress: 5716 on 6223  Progress: 5717 on 6223  Progress: 5718 on 6223  Progress: 5719 on 6223  Progress: 5720 on 6223  Progress: 5721 on 6223  Progress: 5722 on 6223  Progress: 5723 on 6223  Progress: 5724 on 6223  Progress: 5725 on 6223  Progress: 5726 on 6223  Progress: 5727 on 6223  Progress: 5728 on 6223  Progress: 5729 on 6223  Progress: 5730 on 6223  Progress: 5731 on 6223  Progress: 5732 on 6223  Progress: 5733 on 6223  Progress: 5734 on 6223  Progress: 5735 on 6223  Progress: 5736 on 6223  Progress: 5737 on 6223  Progress: 5738 on 6223  Progress: 5739 on 6223  Progress: 5740 on 6223  Progress: 5741 on 6223  Progress: 5742 on 6223  Progress: 5743 on 6223  Progress: 5744 on 6223  Progress: 5745 on 6223  Progress: 5746 on 6223  Progress: 5747 on 6223  Progress: 5748 on 6223  Progress: 5749 on 6223  Progress: 5750 on 6223  Progress: 5751 on 6223  Progress: 5752 on 6223  Progress: 5753 on 6223  Progress: 5754 on 6223  Progress: 5755 on 6223  Progress: 5756 on 6223  Progress: 5757 on 6223  Progress: 5758 on 6223  Progress: 5759 on 6223  Progress: 5760 on 6223  Progress: 5761 on 6223  Progress: 5762 on 6223  Progress: 5763 on 6223  Progress: 5764 on 6223  Progress: 5765 on 6223  Progress: 5766 on 6223  Progress: 5767 on 6223  Progress: 5768 on 6223  Progress: 5769 on 6223  Progress: 5770 on 6223  Progress: 5771 on 6223  Progress: 5772 on 6223  Progress: 5773 on 6223  Progress: 5774 on 6223  Progress: 5775 on 6223  Progress: 5776 on 6223  Progress: 5777 on 6223  Progress: 5778 on 6223  Progress: 5779 on 6223  Progress: 5780 on 6223  Progress: 5781 on 6223  Progress: 5782 on 6223  Progress: 5783 on 6223  Progress: 5784 on 6223  Progress: 5785 on 6223  Progress: 5786 on 6223  Progress: 5787 on 6223  Progress: 5788 on 6223  Progress: 5789 on 6223  Progress: 5790 on 6223  Progress: 5791 on 6223  Progress: 5792 on 6223  Progress: 5793 on 6223  Progress: 5794 on 6223  Progress: 5795 on 6223  Progress: 5796 on 6223  Progress: 5797 on 6223  Progress: 5798 on 6223  Progress: 5799 on 6223  Progress: 5800 on 6223  Progress: 5801 on 6223  Progress: 5802 on 6223  Progress: 5803 on 6223  Progress: 5804 on 6223  Progress: 5805 on 6223  Progress: 5806 on 6223  Progress: 5807 on 6223  Progress: 5808 on 6223  Progress: 5809 on 6223  Progress: 5810 on 6223  Progress: 5811 on 6223  Progress: 5812 on 6223  Progress: 5813 on 6223  Progress: 5814 on 6223  Progress: 5815 on 6223  Progress: 5816 on 6223  Progress: 5817 on 6223  Progress: 5818 on 6223  Progress: 5819 on 6223  Progress: 5820 on 6223  Progress: 5821 on 6223  Progress: 5822 on 6223  Progress: 5823 on 6223  Progress: 5824 on 6223  Progress: 5825 on 6223  Progress: 5826 on 6223  Progress: 5827 on 6223  Progress: 5828 on 6223  Progress: 5829 on 6223  Progress: 5830 on 6223  Progress: 5831 on 6223  Progress: 5832 on 6223  Progress: 5833 on 6223  Progress: 5834 on 6223  Progress: 5835 on 6223  Progress: 5836 on 6223  Progress: 5837 on 6223  Progress: 5838 on 6223  Progress: 5839 on 6223  Progress: 5840 on 6223  Progress: 5841 on 6223  Progress: 5842 on 6223  Progress: 5843 on 6223  Progress: 5844 on 6223  Progress: 5845 on 6223  Progress: 5846 on 6223  Progress: 5847 on 6223  Progress: 5848 on 6223  Progress: 5849 on 6223  Progress: 5850 on 6223  Progress: 5851 on 6223  Progress: 5852 on 6223  Progress: 5853 on 6223  Progress: 5854 on 6223  Progress: 5855 on 6223  Progress: 5856 on 6223  Progress: 5857 on 6223  Progress: 5858 on 6223  Progress: 5859 on 6223  Progress: 5860 on 6223  Progress: 5861 on 6223  Progress: 5862 on 6223  Progress: 5863 on 6223  Progress: 5864 on 6223  Progress: 5865 on 6223  Progress: 5866 on 6223  Progress: 5867 on 6223  Progress: 5868 on 6223  Progress: 5869 on 6223  Progress: 5870 on 6223  Progress: 5871 on 6223  Progress: 5872 on 6223  Progress: 5873 on 6223  Progress: 5874 on 6223  Progress: 5875 on 6223  Progress: 5876 on 6223  Progress: 5877 on 6223  Progress: 5878 on 6223  Progress: 5879 on 6223  Progress: 5880 on 6223  Progress: 5881 on 6223  Progress: 5882 on 6223  Progress: 5883 on 6223  Progress: 5884 on 6223  Progress: 5885 on 6223  Progress: 5886 on 6223  Progress: 5887 on 6223  Progress: 5888 on 6223  Progress: 5889 on 6223  Progress: 5890 on 6223  Progress: 5891 on 6223  Progress: 5892 on 6223  Progress: 5893 on 6223  Progress: 5894 on 6223  Progress: 5895 on 6223  Progress: 5896 on 6223  Progress: 5897 on 6223  Progress: 5898 on 6223  Progress: 5899 on 6223  Progress: 5900 on 6223  Progress: 5901 on 6223  Progress: 5902 on 6223  Progress: 5903 on 6223  Progress: 5904 on 6223  Progress: 5905 on 6223  Progress: 5906 on 6223  Progress: 5907 on 6223  Progress: 5908 on 6223  Progress: 5909 on 6223  Progress: 5910 on 6223  Progress: 5911 on 6223  Progress: 5912 on 6223  Progress: 5913 on 6223  Progress: 5914 on 6223  Progress: 5915 on 6223  Progress: 5916 on 6223  Progress: 5917 on 6223  Progress: 5918 on 6223  Progress: 5919 on 6223  Progress: 5920 on 6223  Progress: 5921 on 6223  Progress: 5922 on 6223  Progress: 5923 on 6223  Progress: 5924 on 6223  Progress: 5925 on 6223  Progress: 5926 on 6223  Progress: 5927 on 6223  Progress: 5928 on 6223  Progress: 5929 on 6223  Progress: 5930 on 6223  Progress: 5931 on 6223  Progress: 5932 on 6223  Progress: 5933 on 6223  Progress: 5934 on 6223  Progress: 5935 on 6223  Progress: 5936 on 6223  Progress: 5937 on 6223  Progress: 5938 on 6223  Progress: 5939 on 6223  Progress: 5940 on 6223  Progress: 5941 on 6223  Progress: 5942 on 6223  Progress: 5943 on 6223  Progress: 5944 on 6223  Progress: 5945 on 6223  Progress: 5946 on 6223  Progress: 5947 on 6223  Progress: 5948 on 6223  Progress: 5949 on 6223  Progress: 5950 on 6223  Progress: 5951 on 6223  Progress: 5952 on 6223  Progress: 5953 on 6223  Progress: 5954 on 6223  Progress: 5955 on 6223  Progress: 5956 on 6223  Progress: 5957 on 6223  Progress: 5958 on 6223  Progress: 5959 on 6223  Progress: 5960 on 6223  Progress: 5961 on 6223  Progress: 5962 on 6223  Progress: 5963 on 6223  Progress: 5964 on 6223  Progress: 5965 on 6223  Progress: 5966 on 6223  Progress: 5967 on 6223  Progress: 5968 on 6223  Progress: 5969 on 6223  Progress: 5970 on 6223  Progress: 5971 on 6223  Progress: 5972 on 6223  Progress: 5973 on 6223  Progress: 5974 on 6223  Progress: 5975 on 6223  Progress: 5976 on 6223  Progress: 5977 on 6223  Progress: 5978 on 6223  Progress: 5979 on 6223  Progress: 5980 on 6223  Progress: 5981 on 6223  Progress: 5982 on 6223  Progress: 5983 on 6223  Progress: 5984 on 6223  Progress: 5985 on 6223  Progress: 5986 on 6223  Progress: 5987 on 6223  Progress: 5988 on 6223  Progress: 5989 on 6223  Progress: 5990 on 6223  Progress: 5991 on 6223  Progress: 5992 on 6223  Progress: 5993 on 6223  Progress: 5994 on 6223  Progress: 5995 on 6223  Progress: 5996 on 6223  Progress: 5997 on 6223  Progress: 5998 on 6223  Progress: 5999 on 6223  Progress: 6000 on 6223  Progress: 6001 on 6223  Progress: 6002 on 6223  Progress: 6003 on 6223  Progress: 6004 on 6223  Progress: 6005 on 6223  Progress: 6006 on 6223  Progress: 6007 on 6223  Progress: 6008 on 6223  Progress: 6009 on 6223  Progress: 6010 on 6223  Progress: 6011 on 6223  Progress: 6012 on 6223  Progress: 6013 on 6223  Progress: 6014 on 6223  Progress: 6015 on 6223  Progress: 6016 on 6223  Progress: 6017 on 6223  Progress: 6018 on 6223  Progress: 6019 on 6223  Progress: 6020 on 6223  Progress: 6021 on 6223  Progress: 6022 on 6223  Progress: 6023 on 6223  Progress: 6024 on 6223  Progress: 6025 on 6223  Progress: 6026 on 6223  Progress: 6027 on 6223  Progress: 6028 on 6223  Progress: 6029 on 6223  Progress: 6030 on 6223  Progress: 6031 on 6223  Progress: 6032 on 6223  Progress: 6033 on 6223  Progress: 6034 on 6223  Progress: 6035 on 6223  Progress: 6036 on 6223  Progress: 6037 on 6223  Progress: 6038 on 6223  Progress: 6039 on 6223  Progress: 6040 on 6223  Progress: 6041 on 6223  Progress: 6042 on 6223  Progress: 6043 on 6223  Progress: 6044 on 6223  Progress: 6045 on 6223  Progress: 6046 on 6223  Progress: 6047 on 6223  Progress: 6048 on 6223  Progress: 6049 on 6223  Progress: 6050 on 6223  Progress: 6051 on 6223  Progress: 6052 on 6223  Progress: 6053 on 6223  Progress: 6054 on 6223  Progress: 6055 on 6223  Progress: 6056 on 6223  Progress: 6057 on 6223  Progress: 6058 on 6223  Progress: 6059 on 6223  Progress: 6060 on 6223  Progress: 6061 on 6223  Progress: 6062 on 6223  Progress: 6063 on 6223  Progress: 6064 on 6223  Progress: 6065 on 6223  Progress: 6066 on 6223  Progress: 6067 on 6223  Progress: 6068 on 6223  Progress: 6069 on 6223  Progress: 6070 on 6223  Progress: 6071 on 6223  Progress: 6072 on 6223  Progress: 6073 on 6223  Progress: 6074 on 6223  Progress: 6075 on 6223  Progress: 6076 on 6223  Progress: 6077 on 6223  Progress: 6078 on 6223  Progress: 6079 on 6223  Progress: 6080 on 6223  Progress: 6081 on 6223  Progress: 6082 on 6223  Progress: 6083 on 6223  Progress: 6084 on 6223  Progress: 6085 on 6223  Progress: 6086 on 6223  Progress: 6087 on 6223  Progress: 6088 on 6223  Progress: 6089 on 6223  Progress: 6090 on 6223  Progress: 6091 on 6223  Progress: 6092 on 6223  Progress: 6093 on 6223  Progress: 6094 on 6223  Progress: 6095 on 6223  Progress: 6096 on 6223  Progress: 6097 on 6223  Progress: 6098 on 6223  Progress: 6099 on 6223  Progress: 6100 on 6223  Progress: 6101 on 6223  Progress: 6102 on 6223  Progress: 6103 on 6223  Progress: 6104 on 6223  Progress: 6105 on 6223  Progress: 6106 on 6223  Progress: 6107 on 6223  Progress: 6108 on 6223  Progress: 6109 on 6223  Progress: 6110 on 6223  Progress: 6111 on 6223  Progress: 6112 on 6223  Progress: 6113 on 6223  Progress: 6114 on 6223  Progress: 6115 on 6223  Progress: 6116 on 6223  Progress: 6117 on 6223  Progress: 6118 on 6223  Progress: 6119 on 6223  Progress: 6120 on 6223  Progress: 6121 on 6223  Progress: 6122 on 6223  Progress: 6123 on 6223  Progress: 6124 on 6223  Progress: 6125 on 6223  Progress: 6126 on 6223  Progress: 6127 on 6223  Progress: 6128 on 6223  Progress: 6129 on 6223  Progress: 6130 on 6223  Progress: 6131 on 6223  Progress: 6132 on 6223  Progress: 6133 on 6223  Progress: 6134 on 6223  Progress: 6135 on 6223  Progress: 6136 on 6223  Progress: 6137 on 6223  Progress: 6138 on 6223  Progress: 6139 on 6223  Progress: 6140 on 6223  Progress: 6141 on 6223  Progress: 6142 on 6223  Progress: 6143 on 6223  Progress: 6144 on 6223  Progress: 6145 on 6223  Progress: 6146 on 6223  Progress: 6147 on 6223  Progress: 6148 on 6223  Progress: 6149 on 6223  Progress: 6150 on 6223  Progress: 6151 on 6223  Progress: 6152 on 6223  Progress: 6153 on 6223  Progress: 6154 on 6223  Progress: 6155 on 6223  Progress: 6156 on 6223  Progress: 6157 on 6223  Progress: 6158 on 6223  Progress: 6159 on 6223  Progress: 6160 on 6223  Progress: 6161 on 6223  Progress: 6162 on 6223  Progress: 6163 on 6223  Progress: 6164 on 6223  Progress: 6165 on 6223  Progress: 6166 on 6223  Progress: 6167 on 6223  Progress: 6168 on 6223  Progress: 6169 on 6223  Progress: 6170 on 6223  Progress: 6171 on 6223  Progress: 6172 on 6223  Progress: 6173 on 6223  Progress: 6174 on 6223  Progress: 6175 on 6223  Progress: 6176 on 6223  Progress: 6177 on 6223  Progress: 6178 on 6223  Progress: 6179 on 6223  Progress: 6180 on 6223  Progress: 6181 on 6223  Progress: 6182 on 6223  Progress: 6183 on 6223  Progress: 6184 on 6223  Progress: 6185 on 6223  Progress: 6186 on 6223  Progress: 6187 on 6223  Progress: 6188 on 6223  Progress: 6189 on 6223  Progress: 6190 on 6223  Progress: 6191 on 6223  Progress: 6192 on 6223  Progress: 6193 on 6223  Progress: 6194 on 6223  Progress: 6195 on 6223  Progress: 6196 on 6223  Progress: 6197 on 6223  Progress: 6198 on 6223  Progress: 6199 on 6223  Progress: 6200 on 6223  Progress: 6201 on 6223  Progress: 6202 on 6223  Progress: 6203 on 6223  Progress: 6204 on 6223  Progress: 6205 on 6223  Progress: 6206 on 6223  Progress: 6207 on 6223  Progress: 6208 on 6223  Progress: 6209 on 6223  Progress: 6210 on 6223  Progress: 6211 on 6223  Progress: 6212 on 6223  Progress: 6213 on 6223  Progress: 6214 on 6223  Progress: 6215 on 6223  Progress: 6216 on 6223  Progress: 6217 on 6223  Progress: 6218 on 6223  Progress: 6219 on 6223  Progress: 6220 on 6223  Progress: 6221 on 6223  Progress: 6222 on 6223  Progress: 6223 on 6223  
BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}
Progress:    1 on 8630  Progress:    2 on 8630  Progress:    3 on 8630  Progress:    4 on 8630  Progress:    5 on 8630  Progress:    6 on 8630  Progress:    7 on 8630  Progress:    8 on 8630  Progress:    9 on 8630  Progress:   10 on 8630  Progress:   11 on 8630  Progress:   12 on 8630  Progress:   13 on 8630  Progress:   14 on 8630  Progress:   15 on 8630  Progress:   16 on 8630  Progress:   17 on 8630  Progress:   18 on 8630  Progress:   19 on 8630  Progress:   20 on 8630  Progress:   21 on 8630  Progress:   22 on 8630  Progress:   23 on 8630  Progress:   24 on 8630  Progress:   25 on 8630  Progress:   26 on 8630  Progress:   27 on 8630  Progress:   28 on 8630  Progress:   29 on 8630  Progress:   30 on 8630  Progress:   31 on 8630  Progress:   32 on 8630  Progress:   33 on 8630  Progress:   34 on 8630  Progress:   35 on 8630  Progress:   36 on 8630  Progress:   37 on 8630  Progress:   38 on 8630  Progress:   39 on 8630  Progress:   40 on 8630  Progress:   41 on 8630  Progress:   42 on 8630  Progress:   43 on 8630  Progress:   44 on 8630  Progress:   45 on 8630  Progress:   46 on 8630  Progress:   47 on 8630  Progress:   48 on 8630  Progress:   49 on 8630  Progress:   50 on 8630  Progress:   51 on 8630  Progress:   52 on 8630  Progress:   53 on 8630  Progress:   54 on 8630  Progress:   55 on 8630  Progress:   56 on 8630  Progress:   57 on 8630  Progress:   58 on 8630  Progress:   59 on 8630  Progress:   60 on 8630  Progress:   61 on 8630  Progress:   62 on 8630  Progress:   63 on 8630  Progress:   64 on 8630  Progress:   65 on 8630  Progress:   66 on 8630  Progress:   67 on 8630  Progress:   68 on 8630  Progress:   69 on 8630  Progress:   70 on 8630  Progress:   71 on 8630  Progress:   72 on 8630  Progress:   73 on 8630  Progress:   74 on 8630  Progress:   75 on 8630  Progress:   76 on 8630  Progress:   77 on 8630  Progress:   78 on 8630  Progress:   79 on 8630  Progress:   80 on 8630  Progress:   81 on 8630  Progress:   82 on 8630  Progress:   83 on 8630  Progress:   84 on 8630  Progress:   85 on 8630  Progress:   86 on 8630  Progress:   87 on 8630  Progress:   88 on 8630  Progress:   89 on 8630  Progress:   90 on 8630  Progress:   91 on 8630  Progress:   92 on 8630  Progress:   93 on 8630  Progress:   94 on 8630  Progress:   95 on 8630  Progress:   96 on 8630  Progress:   97 on 8630  Progress:   98 on 8630  Progress:   99 on 8630  Progress:  100 on 8630  Progress:  101 on 8630  Progress:  102 on 8630  Progress:  103 on 8630  Progress:  104 on 8630  Progress:  105 on 8630  Progress:  106 on 8630  Progress:  107 on 8630  Progress:  108 on 8630  Progress:  109 on 8630  Progress:  110 on 8630  Progress:  111 on 8630  Progress:  112 on 8630  Progress:  113 on 8630  Progress:  114 on 8630  Progress:  115 on 8630  Progress:  116 on 8630  Progress:  117 on 8630  Progress:  118 on 8630  Progress:  119 on 8630  Progress:  120 on 8630  Progress:  121 on 8630  Progress:  122 on 8630  Progress:  123 on 8630  Progress:  124 on 8630  Progress:  125 on 8630  Progress:  126 on 8630  Progress:  127 on 8630  Progress:  128 on 8630  Progress:  129 on 8630  Progress:  130 on 8630  Progress:  131 on 8630  Progress:  132 on 8630  Progress:  133 on 8630  Progress:  134 on 8630  Progress:  135 on 8630  Progress:  136 on 8630  Progress:  137 on 8630  Progress:  138 on 8630  Progress:  139 on 8630  Progress:  140 on 8630  Progress:  141 on 8630  Progress:  142 on 8630  Progress:  143 on 8630  Progress:  144 on 8630  Progress:  145 on 8630  Progress:  146 on 8630  Progress:  147 on 8630  Progress:  148 on 8630  Progress:  149 on 8630  Progress:  150 on 8630  Progress:  151 on 8630  Progress:  152 on 8630  Progress:  153 on 8630  Progress:  154 on 8630  Progress:  155 on 8630  Progress:  156 on 8630  Progress:  157 on 8630  Progress:  158 on 8630  Progress:  159 on 8630  Progress:  160 on 8630  Progress:  161 on 8630  Progress:  162 on 8630  Progress:  163 on 8630  Progress:  164 on 8630  Progress:  165 on 8630  Progress:  166 on 8630  Progress:  167 on 8630  Progress:  168 on 8630  Progress:  169 on 8630  Progress:  170 on 8630  Progress:  171 on 8630  Progress:  172 on 8630  Progress:  173 on 8630  Progress:  174 on 8630  Progress:  175 on 8630  Progress:  176 on 8630  Progress:  177 on 8630  Progress:  178 on 8630  Progress:  179 on 8630  Progress:  180 on 8630  Progress:  181 on 8630  Progress:  182 on 8630  Progress:  183 on 8630  Progress:  184 on 8630  Progress:  185 on 8630  Progress:  186 on 8630  Progress:  187 on 8630  Progress:  188 on 8630  Progress:  189 on 8630  Progress:  190 on 8630  Progress:  191 on 8630  Progress:  192 on 8630  Progress:  193 on 8630  Progress:  194 on 8630  Progress:  195 on 8630  Progress:  196 on 8630  Progress:  197 on 8630  Progress:  198 on 8630  Progress:  199 on 8630  Progress:  200 on 8630  Progress:  201 on 8630  Progress:  202 on 8630  Progress:  203 on 8630  Progress:  204 on 8630  Progress:  205 on 8630  Progress:  206 on 8630  Progress:  207 on 8630  Progress:  208 on 8630  Progress:  209 on 8630  Progress:  210 on 8630  Progress:  211 on 8630  Progress:  212 on 8630  Progress:  213 on 8630  Progress:  214 on 8630  Progress:  215 on 8630  Progress:  216 on 8630  Progress:  217 on 8630  Progress:  218 on 8630  Progress:  219 on 8630  Progress:  220 on 8630  Progress:  221 on 8630  Progress:  222 on 8630  Progress:  223 on 8630  Progress:  224 on 8630  Progress:  225 on 8630  Progress:  226 on 8630  Progress:  227 on 8630  Progress:  228 on 8630  Progress:  229 on 8630  Progress:  230 on 8630  Progress:  231 on 8630  Progress:  232 on 8630  Progress:  233 on 8630  Progress:  234 on 8630  Progress:  235 on 8630  Progress:  236 on 8630  Progress:  237 on 8630  Progress:  238 on 8630  Progress:  239 on 8630  Progress:  240 on 8630  Progress:  241 on 8630  Progress:  242 on 8630  Progress:  243 on 8630  Progress:  244 on 8630  Progress:  245 on 8630  Progress:  246 on 8630  Progress:  247 on 8630  Progress:  248 on 8630  Progress:  249 on 8630  Progress:  250 on 8630  Progress:  251 on 8630  Progress:  252 on 8630  Progress:  253 on 8630  Progress:  254 on 8630  Progress:  255 on 8630  Progress:  256 on 8630  Progress:  257 on 8630  Progress:  258 on 8630  Progress:  259 on 8630  Progress:  260 on 8630  Progress:  261 on 8630  Progress:  262 on 8630  Progress:  263 on 8630  Progress:  264 on 8630  Progress:  265 on 8630  Progress:  266 on 8630  Progress:  267 on 8630  Progress:  268 on 8630  Progress:  269 on 8630  Progress:  270 on 8630  Progress:  271 on 8630  Progress:  272 on 8630  Progress:  273 on 8630  Progress:  274 on 8630  Progress:  275 on 8630  Progress:  276 on 8630  Progress:  277 on 8630  Progress:  278 on 8630  Progress:  279 on 8630  Progress:  280 on 8630  Progress:  281 on 8630  Progress:  282 on 8630  Progress:  283 on 8630  Progress:  284 on 8630  Progress:  285 on 8630  Progress:  286 on 8630  Progress:  287 on 8630  Progress:  288 on 8630  Progress:  289 on 8630  Progress:  290 on 8630  Progress:  291 on 8630  Progress:  292 on 8630  Progress:  293 on 8630  Progress:  294 on 8630  Progress:  295 on 8630  Progress:  296 on 8630  Progress:  297 on 8630  Progress:  298 on 8630  Progress:  299 on 8630  Progress:  300 on 8630  Progress:  301 on 8630  Progress:  302 on 8630  Progress:  303 on 8630  Progress:  304 on 8630  Progress:  305 on 8630  Progress:  306 on 8630  Progress:  307 on 8630  Progress:  308 on 8630  Progress:  309 on 8630  Progress:  310 on 8630  Progress:  311 on 8630  Progress:  312 on 8630  Progress:  313 on 8630  Progress:  314 on 8630  Progress:  315 on 8630  Progress:  316 on 8630  Progress:  317 on 8630  Progress:  318 on 8630  Progress:  319 on 8630  Progress:  320 on 8630  Progress:  321 on 8630  Progress:  322 on 8630  Progress:  323 on 8630  Progress:  324 on 8630  Progress:  325 on 8630  Progress:  326 on 8630  Progress:  327 on 8630  Progress:  328 on 8630  Progress:  329 on 8630  Progress:  330 on 8630  Progress:  331 on 8630  Progress:  332 on 8630  Progress:  333 on 8630  Progress:  334 on 8630  Progress:  335 on 8630  Progress:  336 on 8630  Progress:  337 on 8630  Progress:  338 on 8630  Progress:  339 on 8630  Progress:  340 on 8630  Progress:  341 on 8630  Progress:  342 on 8630  Progress:  343 on 8630  Progress:  344 on 8630  Progress:  345 on 8630  Progress:  346 on 8630  Progress:  347 on 8630  Progress:  348 on 8630  Progress:  349 on 8630  Progress:  350 on 8630  Progress:  351 on 8630  Progress:  352 on 8630  Progress:  353 on 8630  Progress:  354 on 8630  Progress:  355 on 8630  Progress:  356 on 8630  Progress:  357 on 8630  Progress:  358 on 8630  Progress:  359 on 8630  Progress:  360 on 8630  Progress:  361 on 8630  Progress:  362 on 8630  Progress:  363 on 8630  Progress:  364 on 8630  Progress:  365 on 8630  Progress:  366 on 8630  Progress:  367 on 8630  Progress:  368 on 8630  Progress:  369 on 8630  Progress:  370 on 8630  Progress:  371 on 8630  Progress:  372 on 8630  Progress:  373 on 8630  Progress:  374 on 8630  Progress:  375 on 8630  Progress:  376 on 8630  Progress:  377 on 8630  Progress:  378 on 8630  Progress:  379 on 8630  Progress:  380 on 8630  Progress:  381 on 8630  Progress:  382 on 8630  Progress:  383 on 8630  Progress:  384 on 8630  Progress:  385 on 8630  Progress:  386 on 8630  Progress:  387 on 8630  Progress:  388 on 8630  Progress:  389 on 8630  Progress:  390 on 8630  Progress:  391 on 8630  Progress:  392 on 8630  Progress:  393 on 8630  Progress:  394 on 8630  Progress:  395 on 8630  Progress:  396 on 8630  Progress:  397 on 8630  Progress:  398 on 8630  Progress:  399 on 8630  Progress:  400 on 8630  Progress:  401 on 8630  Progress:  402 on 8630  Progress:  403 on 8630  Progress:  404 on 8630  Progress:  405 on 8630  Progress:  406 on 8630  Progress:  407 on 8630  Progress:  408 on 8630  Progress:  409 on 8630  Progress:  410 on 8630  Progress:  411 on 8630  Progress:  412 on 8630  Progress:  413 on 8630  Progress:  414 on 8630  Progress:  415 on 8630  Progress:  416 on 8630  Progress:  417 on 8630  Progress:  418 on 8630  Progress:  419 on 8630  Progress:  420 on 8630  Progress:  421 on 8630  Progress:  422 on 8630  Progress:  423 on 8630  Progress:  424 on 8630  Progress:  425 on 8630  Progress:  426 on 8630  Progress:  427 on 8630  Progress:  428 on 8630  Progress:  429 on 8630  Progress:  430 on 8630  Progress:  431 on 8630  Progress:  432 on 8630  Progress:  433 on 8630  Progress:  434 on 8630  Progress:  435 on 8630  Progress:  436 on 8630  Progress:  437 on 8630  Progress:  438 on 8630  Progress:  439 on 8630  Progress:  440 on 8630  Progress:  441 on 8630  Progress:  442 on 8630  Progress:  443 on 8630  Progress:  444 on 8630  Progress:  445 on 8630  Progress:  446 on 8630  Progress:  447 on 8630  Progress:  448 on 8630  Progress:  449 on 8630  Progress:  450 on 8630  Progress:  451 on 8630  Progress:  452 on 8630  Progress:  453 on 8630  Progress:  454 on 8630  Progress:  455 on 8630  Progress:  456 on 8630  Progress:  457 on 8630  Progress:  458 on 8630  Progress:  459 on 8630  Progress:  460 on 8630  Progress:  461 on 8630  Progress:  462 on 8630  Progress:  463 on 8630  Progress:  464 on 8630  Progress:  465 on 8630  Progress:  466 on 8630  Progress:  467 on 8630  Progress:  468 on 8630  Progress:  469 on 8630  Progress:  470 on 8630  Progress:  471 on 8630  Progress:  472 on 8630  Progress:  473 on 8630  Progress:  474 on 8630  Progress:  475 on 8630  Progress:  476 on 8630  Progress:  477 on 8630  Progress:  478 on 8630  Progress:  479 on 8630  Progress:  480 on 8630  Progress:  481 on 8630  Progress:  482 on 8630  Progress:  483 on 8630  Progress:  484 on 8630  Progress:  485 on 8630  Progress:  486 on 8630  Progress:  487 on 8630  Progress:  488 on 8630  Progress:  489 on 8630  Progress:  490 on 8630  Progress:  491 on 8630  Progress:  492 on 8630  Progress:  493 on 8630  Progress:  494 on 8630  Progress:  495 on 8630  Progress:  496 on 8630  Progress:  497 on 8630  Progress:  498 on 8630  Progress:  499 on 8630  Progress:  500 on 8630  Progress:  501 on 8630  Progress:  502 on 8630  Progress:  503 on 8630  Progress:  504 on 8630  Progress:  505 on 8630  Progress:  506 on 8630  Progress:  507 on 8630  Progress:  508 on 8630  Progress:  509 on 8630  Progress:  510 on 8630  Progress:  511 on 8630  Progress:  512 on 8630  Progress:  513 on 8630  Progress:  514 on 8630  Progress:  515 on 8630  Progress:  516 on 8630  Progress:  517 on 8630  Progress:  518 on 8630  Progress:  519 on 8630  Progress:  520 on 8630  Progress:  521 on 8630  Progress:  522 on 8630  Progress:  523 on 8630  Progress:  524 on 8630  Progress:  525 on 8630  Progress:  526 on 8630  Progress:  527 on 8630  Progress:  528 on 8630  Progress:  529 on 8630  Progress:  530 on 8630  Progress:  531 on 8630  Progress:  532 on 8630  Progress:  533 on 8630  Progress:  534 on 8630  Progress:  535 on 8630  Progress:  536 on 8630  Progress:  537 on 8630  Progress:  538 on 8630  Progress:  539 on 8630  Progress:  540 on 8630  Progress:  541 on 8630  Progress:  542 on 8630  Progress:  543 on 8630  Progress:  544 on 8630  Progress:  545 on 8630  Progress:  546 on 8630  Progress:  547 on 8630  Progress:  548 on 8630  Progress:  549 on 8630  Progress:  550 on 8630  Progress:  551 on 8630  Progress:  552 on 8630  Progress:  553 on 8630  Progress:  554 on 8630  Progress:  555 on 8630  Progress:  556 on 8630  Progress:  557 on 8630  Progress:  558 on 8630  Progress:  559 on 8630  Progress:  560 on 8630  Progress:  561 on 8630  Progress:  562 on 8630  Progress:  563 on 8630  Progress:  564 on 8630  Progress:  565 on 8630  Progress:  566 on 8630  Progress:  567 on 8630  Progress:  568 on 8630  Progress:  569 on 8630  Progress:  570 on 8630  Progress:  571 on 8630  Progress:  572 on 8630  Progress:  573 on 8630  Progress:  574 on 8630  Progress:  575 on 8630  Progress:  576 on 8630  Progress:  577 on 8630  Progress:  578 on 8630  Progress:  579 on 8630  Progress:  580 on 8630  Progress:  581 on 8630  Progress:  582 on 8630  Progress:  583 on 8630  Progress:  584 on 8630  Progress:  585 on 8630  Progress:  586 on 8630  Progress:  587 on 8630  Progress:  588 on 8630  Progress:  589 on 8630  Progress:  590 on 8630  Progress:  591 on 8630  Progress:  592 on 8630  Progress:  593 on 8630  Progress:  594 on 8630  Progress:  595 on 8630  Progress:  596 on 8630  Progress:  597 on 8630  Progress:  598 on 8630  Progress:  599 on 8630  Progress:  600 on 8630  Progress:  601 on 8630  Progress:  602 on 8630  Progress:  603 on 8630  Progress:  604 on 8630  Progress:  605 on 8630  Progress:  606 on 8630  Progress:  607 on 8630  Progress:  608 on 8630  Progress:  609 on 8630  Progress:  610 on 8630  Progress:  611 on 8630  Progress:  612 on 8630  Progress:  613 on 8630  Progress:  614 on 8630  Progress:  615 on 8630  Progress:  616 on 8630  Progress:  617 on 8630  Progress:  618 on 8630  Progress:  619 on 8630  Progress:  620 on 8630  Progress:  621 on 8630  Progress:  622 on 8630  Progress:  623 on 8630  Progress:  624 on 8630  Progress:  625 on 8630  Progress:  626 on 8630  Progress:  627 on 8630  Progress:  628 on 8630  Progress:  629 on 8630  Progress:  630 on 8630  Progress:  631 on 8630  Progress:  632 on 8630  Progress:  633 on 8630  Progress:  634 on 8630  Progress:  635 on 8630  Progress:  636 on 8630  Progress:  637 on 8630  Progress:  638 on 8630  Progress:  639 on 8630  Progress:  640 on 8630  Progress:  641 on 8630  Progress:  642 on 8630  Progress:  643 on 8630  Progress:  644 on 8630  Progress:  645 on 8630  Progress:  646 on 8630  Progress:  647 on 8630  Progress:  648 on 8630  Progress:  649 on 8630  Progress:  650 on 8630  Progress:  651 on 8630  Progress:  652 on 8630  Progress:  653 on 8630  Progress:  654 on 8630  Progress:  655 on 8630  Progress:  656 on 8630  Progress:  657 on 8630  Progress:  658 on 8630  Progress:  659 on 8630  Progress:  660 on 8630  Progress:  661 on 8630  Progress:  662 on 8630  Progress:  663 on 8630  Progress:  664 on 8630  Progress:  665 on 8630  Progress:  666 on 8630  Progress:  667 on 8630  Progress:  668 on 8630  Progress:  669 on 8630  Progress:  670 on 8630  Progress:  671 on 8630  Progress:  672 on 8630  Progress:  673 on 8630  Progress:  674 on 8630  Progress:  675 on 8630  Progress:  676 on 8630  Progress:  677 on 8630  Progress:  678 on 8630  Progress:  679 on 8630  Progress:  680 on 8630  Progress:  681 on 8630  Progress:  682 on 8630  Progress:  683 on 8630  Progress:  684 on 8630  Progress:  685 on 8630  Progress:  686 on 8630  Progress:  687 on 8630  Progress:  688 on 8630  Progress:  689 on 8630  Progress:  690 on 8630  Progress:  691 on 8630  Progress:  692 on 8630  Progress:  693 on 8630  Progress:  694 on 8630  Progress:  695 on 8630  Progress:  696 on 8630  Progress:  697 on 8630  Progress:  698 on 8630  Progress:  699 on 8630  Progress:  700 on 8630  Progress:  701 on 8630  Progress:  702 on 8630  Progress:  703 on 8630  Progress:  704 on 8630  Progress:  705 on 8630  Progress:  706 on 8630  Progress:  707 on 8630  Progress:  708 on 8630  Progress:  709 on 8630  Progress:  710 on 8630  Progress:  711 on 8630  Progress:  712 on 8630  Progress:  713 on 8630  Progress:  714 on 8630  Progress:  715 on 8630  Progress:  716 on 8630  Progress:  717 on 8630  Progress:  718 on 8630  Progress:  719 on 8630  Progress:  720 on 8630  Progress:  721 on 8630  Progress:  722 on 8630  Progress:  723 on 8630  Progress:  724 on 8630  Progress:  725 on 8630  Progress:  726 on 8630  Progress:  727 on 8630  Progress:  728 on 8630  Progress:  729 on 8630  Progress:  730 on 8630  Progress:  731 on 8630  Progress:  732 on 8630  Progress:  733 on 8630  Progress:  734 on 8630  Progress:  735 on 8630  Progress:  736 on 8630  Progress:  737 on 8630  Progress:  738 on 8630  Progress:  739 on 8630  Progress:  740 on 8630  Progress:  741 on 8630  Progress:  742 on 8630  Progress:  743 on 8630  Progress:  744 on 8630  Progress:  745 on 8630  Progress:  746 on 8630  Progress:  747 on 8630  Progress:  748 on 8630  Progress:  749 on 8630  Progress:  750 on 8630  Progress:  751 on 8630  Progress:  752 on 8630  Progress:  753 on 8630  Progress:  754 on 8630  Progress:  755 on 8630  Progress:  756 on 8630  Progress:  757 on 8630  Progress:  758 on 8630  Progress:  759 on 8630  Progress:  760 on 8630  Progress:  761 on 8630  Progress:  762 on 8630  Progress:  763 on 8630  Progress:  764 on 8630  Progress:  765 on 8630  Progress:  766 on 8630  Progress:  767 on 8630  Progress:  768 on 8630  Progress:  769 on 8630  Progress:  770 on 8630  Progress:  771 on 8630  Progress:  772 on 8630  Progress:  773 on 8630  Progress:  774 on 8630  Progress:  775 on 8630  Progress:  776 on 8630  Progress:  777 on 8630  Progress:  778 on 8630  Progress:  779 on 8630  Progress:  780 on 8630  Progress:  781 on 8630  Progress:  782 on 8630  Progress:  783 on 8630  Progress:  784 on 8630  Progress:  785 on 8630  Progress:  786 on 8630  Progress:  787 on 8630  Progress:  788 on 8630  Progress:  789 on 8630  Progress:  790 on 8630  Progress:  791 on 8630  Progress:  792 on 8630  Progress:  793 on 8630  Progress:  794 on 8630  Progress:  795 on 8630  Progress:  796 on 8630  Progress:  797 on 8630  Progress:  798 on 8630  Progress:  799 on 8630  Progress:  800 on 8630  Progress:  801 on 8630  Progress:  802 on 8630  Progress:  803 on 8630  Progress:  804 on 8630  Progress:  805 on 8630  Progress:  806 on 8630  Progress:  807 on 8630  Progress:  808 on 8630  Progress:  809 on 8630  Progress:  810 on 8630  Progress:  811 on 8630  Progress:  812 on 8630  Progress:  813 on 8630  Progress:  814 on 8630  Progress:  815 on 8630  Progress:  816 on 8630  Progress:  817 on 8630  Progress:  818 on 8630  Progress:  819 on 8630  Progress:  820 on 8630  Progress:  821 on 8630  Progress:  822 on 8630  Progress:  823 on 8630  Progress:  824 on 8630  Progress:  825 on 8630  Progress:  826 on 8630  Progress:  827 on 8630  Progress:  828 on 8630  Progress:  829 on 8630  Progress:  830 on 8630  Progress:  831 on 8630  Progress:  832 on 8630  Progress:  833 on 8630  Progress:  834 on 8630  Progress:  835 on 8630  Progress:  836 on 8630  Progress:  837 on 8630  Progress:  838 on 8630  Progress:  839 on 8630  Progress:  840 on 8630  Progress:  841 on 8630  Progress:  842 on 8630  Progress:  843 on 8630  Progress:  844 on 8630  Progress:  845 on 8630  Progress:  846 on 8630  Progress:  847 on 8630  Progress:  848 on 8630  Progress:  849 on 8630  Progress:  850 on 8630  Progress:  851 on 8630  Progress:  852 on 8630  Progress:  853 on 8630  Progress:  854 on 8630  Progress:  855 on 8630  Progress:  856 on 8630  Progress:  857 on 8630  Progress:  858 on 8630  Progress:  859 on 8630  Progress:  860 on 8630  Progress:  861 on 8630  Progress:  862 on 8630  Progress:  863 on 8630  Progress:  864 on 8630  Progress:  865 on 8630  Progress:  866 on 8630  Progress:  867 on 8630  Progress:  868 on 8630  Progress:  869 on 8630  Progress:  870 on 8630  Progress:  871 on 8630  Progress:  872 on 8630  Progress:  873 on 8630  Progress:  874 on 8630  Progress:  875 on 8630  Progress:  876 on 8630  Progress:  877 on 8630  Progress:  878 on 8630  Progress:  879 on 8630  Progress:  880 on 8630  Progress:  881 on 8630  Progress:  882 on 8630  Progress:  883 on 8630  Progress:  884 on 8630  Progress:  885 on 8630  Progress:  886 on 8630  Progress:  887 on 8630  Progress:  888 on 8630  Progress:  889 on 8630  Progress:  890 on 8630  Progress:  891 on 8630  Progress:  892 on 8630  Progress:  893 on 8630  Progress:  894 on 8630  Progress:  895 on 8630  Progress:  896 on 8630  Progress:  897 on 8630  Progress:  898 on 8630  Progress:  899 on 8630  Progress:  900 on 8630  Progress:  901 on 8630  Progress:  902 on 8630  Progress:  903 on 8630  Progress:  904 on 8630  Progress:  905 on 8630  Progress:  906 on 8630  Progress:  907 on 8630  Progress:  908 on 8630  Progress:  909 on 8630  Progress:  910 on 8630  Progress:  911 on 8630  Progress:  912 on 8630  Progress:  913 on 8630  Progress:  914 on 8630  Progress:  915 on 8630  Progress:  916 on 8630  Progress:  917 on 8630  Progress:  918 on 8630  Progress:  919 on 8630  Progress:  920 on 8630  Progress:  921 on 8630  Progress:  922 on 8630  Progress:  923 on 8630  Progress:  924 on 8630  Progress:  925 on 8630  Progress:  926 on 8630  Progress:  927 on 8630  Progress:  928 on 8630  Progress:  929 on 8630  Progress:  930 on 8630  Progress:  931 on 8630  Progress:  932 on 8630  Progress:  933 on 8630  Progress:  934 on 8630  Progress:  935 on 8630  Progress:  936 on 8630  Progress:  937 on 8630  Progress:  938 on 8630  Progress:  939 on 8630  Progress:  940 on 8630  Progress:  941 on 8630  Progress:  942 on 8630  Progress:  943 on 8630  Progress:  944 on 8630  Progress:  945 on 8630  Progress:  946 on 8630  Progress:  947 on 8630  Progress:  948 on 8630  Progress:  949 on 8630  Progress:  950 on 8630  Progress:  951 on 8630  Progress:  952 on 8630  Progress:  953 on 8630  Progress:  954 on 8630  Progress:  955 on 8630  Progress:  956 on 8630  Progress:  957 on 8630  Progress:  958 on 8630  Progress:  959 on 8630  Progress:  960 on 8630  Progress:  961 on 8630  Progress:  962 on 8630  Progress:  963 on 8630  Progress:  964 on 8630  Progress:  965 on 8630  Progress:  966 on 8630  Progress:  967 on 8630  Progress:  968 on 8630  Progress:  969 on 8630  Progress:  970 on 8630  Progress:  971 on 8630  Progress:  972 on 8630  Progress:  973 on 8630  Progress:  974 on 8630  Progress:  975 on 8630  Progress:  976 on 8630  Progress:  977 on 8630  Progress:  978 on 8630  Progress:  979 on 8630  Progress:  980 on 8630  Progress:  981 on 8630  Progress:  982 on 8630  Progress:  983 on 8630  Progress:  984 on 8630  Progress:  985 on 8630  Progress:  986 on 8630  Progress:  987 on 8630  Progress:  988 on 8630  Progress:  989 on 8630  Progress:  990 on 8630  Progress:  991 on 8630  Progress:  992 on 8630  Progress:  993 on 8630  Progress:  994 on 8630  Progress:  995 on 8630  Progress:  996 on 8630  Progress:  997 on 8630  Progress:  998 on 8630  Progress:  999 on 8630  Progress: 1000 on 8630  Progress: 1001 on 8630  Progress: 1002 on 8630  Progress: 1003 on 8630  Progress: 1004 on 8630  Progress: 1005 on 8630  Progress: 1006 on 8630  Progress: 1007 on 8630  Progress: 1008 on 8630  Progress: 1009 on 8630  Progress: 1010 on 8630  Progress: 1011 on 8630  Progress: 1012 on 8630  Progress: 1013 on 8630  Progress: 1014 on 8630  Progress: 1015 on 8630  Progress: 1016 on 8630  Progress: 1017 on 8630  Progress: 1018 on 8630  Progress: 1019 on 8630  Progress: 1020 on 8630  Progress: 1021 on 8630  Progress: 1022 on 8630  Progress: 1023 on 8630  Progress: 1024 on 8630  Progress: 1025 on 8630  Progress: 1026 on 8630  Progress: 1027 on 8630  Progress: 1028 on 8630  Progress: 1029 on 8630  Progress: 1030 on 8630  Progress: 1031 on 8630  Progress: 1032 on 8630  Progress: 1033 on 8630  Progress: 1034 on 8630  Progress: 1035 on 8630  Progress: 1036 on 8630  Progress: 1037 on 8630  Progress: 1038 on 8630  Progress: 1039 on 8630  Progress: 1040 on 8630  Progress: 1041 on 8630  Progress: 1042 on 8630  Progress: 1043 on 8630  Progress: 1044 on 8630  Progress: 1045 on 8630  Progress: 1046 on 8630  Progress: 1047 on 8630  Progress: 1048 on 8630  Progress: 1049 on 8630  Progress: 1050 on 8630  Progress: 1051 on 8630  Progress: 1052 on 8630  Progress: 1053 on 8630  Progress: 1054 on 8630  Progress: 1055 on 8630  Progress: 1056 on 8630  Progress: 1057 on 8630  Progress: 1058 on 8630  Progress: 1059 on 8630  Progress: 1060 on 8630  Progress: 1061 on 8630  Progress: 1062 on 8630  Progress: 1063 on 8630  Progress: 1064 on 8630  Progress: 1065 on 8630  Progress: 1066 on 8630  Progress: 1067 on 8630  Progress: 1068 on 8630  Progress: 1069 on 8630  Progress: 1070 on 8630  Progress: 1071 on 8630  Progress: 1072 on 8630  Progress: 1073 on 8630  Progress: 1074 on 8630  Progress: 1075 on 8630  Progress: 1076 on 8630  Progress: 1077 on 8630  Progress: 1078 on 8630  Progress: 1079 on 8630  Progress: 1080 on 8630  Progress: 1081 on 8630  Progress: 1082 on 8630  Progress: 1083 on 8630  Progress: 1084 on 8630  Progress: 1085 on 8630  Progress: 1086 on 8630  Progress: 1087 on 8630  Progress: 1088 on 8630  Progress: 1089 on 8630  Progress: 1090 on 8630  Progress: 1091 on 8630  Progress: 1092 on 8630  Progress: 1093 on 8630  Progress: 1094 on 8630  Progress: 1095 on 8630  Progress: 1096 on 8630  Progress: 1097 on 8630  Progress: 1098 on 8630  Progress: 1099 on 8630  Progress: 1100 on 8630  Progress: 1101 on 8630  Progress: 1102 on 8630  Progress: 1103 on 8630  Progress: 1104 on 8630  Progress: 1105 on 8630  Progress: 1106 on 8630  Progress: 1107 on 8630  Progress: 1108 on 8630  Progress: 1109 on 8630  Progress: 1110 on 8630  Progress: 1111 on 8630  Progress: 1112 on 8630  Progress: 1113 on 8630  Progress: 1114 on 8630  Progress: 1115 on 8630  Progress: 1116 on 8630  Progress: 1117 on 8630  Progress: 1118 on 8630  Progress: 1119 on 8630  Progress: 1120 on 8630  Progress: 1121 on 8630  Progress: 1122 on 8630  Progress: 1123 on 8630  Progress: 1124 on 8630  Progress: 1125 on 8630  Progress: 1126 on 8630  Progress: 1127 on 8630  Progress: 1128 on 8630  Progress: 1129 on 8630  Progress: 1130 on 8630  Progress: 1131 on 8630  Progress: 1132 on 8630  Progress: 1133 on 8630  Progress: 1134 on 8630  Progress: 1135 on 8630  Progress: 1136 on 8630  Progress: 1137 on 8630  Progress: 1138 on 8630  Progress: 1139 on 8630  Progress: 1140 on 8630  Progress: 1141 on 8630  Progress: 1142 on 8630  Progress: 1143 on 8630  Progress: 1144 on 8630  Progress: 1145 on 8630  Progress: 1146 on 8630  Progress: 1147 on 8630  Progress: 1148 on 8630  Progress: 1149 on 8630  Progress: 1150 on 8630  Progress: 1151 on 8630  Progress: 1152 on 8630  Progress: 1153 on 8630  Progress: 1154 on 8630  Progress: 1155 on 8630  Progress: 1156 on 8630  Progress: 1157 on 8630  Progress: 1158 on 8630  Progress: 1159 on 8630  Progress: 1160 on 8630  Progress: 1161 on 8630  Progress: 1162 on 8630  Progress: 1163 on 8630  Progress: 1164 on 8630  Progress: 1165 on 8630  Progress: 1166 on 8630  Progress: 1167 on 8630  Progress: 1168 on 8630  Progress: 1169 on 8630  Progress: 1170 on 8630  Progress: 1171 on 8630  Progress: 1172 on 8630  Progress: 1173 on 8630  Progress: 1174 on 8630  Progress: 1175 on 8630  Progress: 1176 on 8630  Progress: 1177 on 8630  Progress: 1178 on 8630  Progress: 1179 on 8630  Progress: 1180 on 8630  Progress: 1181 on 8630  Progress: 1182 on 8630  Progress: 1183 on 8630  Progress: 1184 on 8630  Progress: 1185 on 8630  Progress: 1186 on 8630  Progress: 1187 on 8630  Progress: 1188 on 8630  Progress: 1189 on 8630  Progress: 1190 on 8630  Progress: 1191 on 8630  Progress: 1192 on 8630  Progress: 1193 on 8630  Progress: 1194 on 8630  Progress: 1195 on 8630  Progress: 1196 on 8630  Progress: 1197 on 8630  Progress: 1198 on 8630  Progress: 1199 on 8630  Progress: 1200 on 8630  Progress: 1201 on 8630  Progress: 1202 on 8630  Progress: 1203 on 8630  Progress: 1204 on 8630  Progress: 1205 on 8630  Progress: 1206 on 8630  Progress: 1207 on 8630  Progress: 1208 on 8630  Progress: 1209 on 8630  Progress: 1210 on 8630  Progress: 1211 on 8630  Progress: 1212 on 8630  Progress: 1213 on 8630  Progress: 1214 on 8630  Progress: 1215 on 8630  Progress: 1216 on 8630  Progress: 1217 on 8630  Progress: 1218 on 8630  Progress: 1219 on 8630  Progress: 1220 on 8630  Progress: 1221 on 8630  Progress: 1222 on 8630  Progress: 1223 on 8630  Progress: 1224 on 8630  Progress: 1225 on 8630  Progress: 1226 on 8630  Progress: 1227 on 8630  Progress: 1228 on 8630  Progress: 1229 on 8630  Progress: 1230 on 8630  Progress: 1231 on 8630  Progress: 1232 on 8630  Progress: 1233 on 8630  Progress: 1234 on 8630  Progress: 1235 on 8630  Progress: 1236 on 8630  Progress: 1237 on 8630  Progress: 1238 on 8630  Progress: 1239 on 8630  Progress: 1240 on 8630  Progress: 1241 on 8630  Progress: 1242 on 8630  Progress: 1243 on 8630  Progress: 1244 on 8630  Progress: 1245 on 8630  Progress: 1246 on 8630  Progress: 1247 on 8630  Progress: 1248 on 8630  Progress: 1249 on 8630  Progress: 1250 on 8630  Progress: 1251 on 8630  Progress: 1252 on 8630  Progress: 1253 on 8630  Progress: 1254 on 8630  Progress: 1255 on 8630  Progress: 1256 on 8630  Progress: 1257 on 8630  Progress: 1258 on 8630  Progress: 1259 on 8630  Progress: 1260 on 8630  Progress: 1261 on 8630  Progress: 1262 on 8630  Progress: 1263 on 8630  Progress: 1264 on 8630  Progress: 1265 on 8630  Progress: 1266 on 8630  Progress: 1267 on 8630  Progress: 1268 on 8630  Progress: 1269 on 8630  Progress: 1270 on 8630  Progress: 1271 on 8630  Progress: 1272 on 8630  Progress: 1273 on 8630  Progress: 1274 on 8630  Progress: 1275 on 8630  Progress: 1276 on 8630  Progress: 1277 on 8630  Progress: 1278 on 8630  Progress: 1279 on 8630  Progress: 1280 on 8630  Progress: 1281 on 8630  Progress: 1282 on 8630  Progress: 1283 on 8630  Progress: 1284 on 8630  Progress: 1285 on 8630  Progress: 1286 on 8630  Progress: 1287 on 8630  Progress: 1288 on 8630  Progress: 1289 on 8630  Progress: 1290 on 8630  Progress: 1291 on 8630  Progress: 1292 on 8630  Progress: 1293 on 8630  Progress: 1294 on 8630  Progress: 1295 on 8630  Progress: 1296 on 8630  Progress: 1297 on 8630  Progress: 1298 on 8630  Progress: 1299 on 8630  Progress: 1300 on 8630  Progress: 1301 on 8630  Progress: 1302 on 8630  Progress: 1303 on 8630  Progress: 1304 on 8630  Progress: 1305 on 8630  Progress: 1306 on 8630  Progress: 1307 on 8630  Progress: 1308 on 8630  Progress: 1309 on 8630  Progress: 1310 on 8630  Progress: 1311 on 8630  Progress: 1312 on 8630  Progress: 1313 on 8630  Progress: 1314 on 8630  Progress: 1315 on 8630  Progress: 1316 on 8630  Progress: 1317 on 8630  Progress: 1318 on 8630  Progress: 1319 on 8630  Progress: 1320 on 8630  Progress: 1321 on 8630  Progress: 1322 on 8630  Progress: 1323 on 8630  Progress: 1324 on 8630  Progress: 1325 on 8630  Progress: 1326 on 8630  Progress: 1327 on 8630  Progress: 1328 on 8630  Progress: 1329 on 8630  Progress: 1330 on 8630  Progress: 1331 on 8630  Progress: 1332 on 8630  Progress: 1333 on 8630  Progress: 1334 on 8630  Progress: 1335 on 8630  Progress: 1336 on 8630  Progress: 1337 on 8630  Progress: 1338 on 8630  Progress: 1339 on 8630  Progress: 1340 on 8630  Progress: 1341 on 8630  Progress: 1342 on 8630  Progress: 1343 on 8630  Progress: 1344 on 8630  Progress: 1345 on 8630  Progress: 1346 on 8630  Progress: 1347 on 8630  Progress: 1348 on 8630  Progress: 1349 on 8630  Progress: 1350 on 8630  Progress: 1351 on 8630  Progress: 1352 on 8630  Progress: 1353 on 8630  Progress: 1354 on 8630  Progress: 1355 on 8630  Progress: 1356 on 8630  Progress: 1357 on 8630  Progress: 1358 on 8630  Progress: 1359 on 8630  Progress: 1360 on 8630  Progress: 1361 on 8630  Progress: 1362 on 8630  Progress: 1363 on 8630  Progress: 1364 on 8630  Progress: 1365 on 8630  Progress: 1366 on 8630  Progress: 1367 on 8630  Progress: 1368 on 8630  Progress: 1369 on 8630  Progress: 1370 on 8630  Progress: 1371 on 8630  Progress: 1372 on 8630  Progress: 1373 on 8630  Progress: 1374 on 8630  Progress: 1375 on 8630  Progress: 1376 on 8630  Progress: 1377 on 8630  Progress: 1378 on 8630  Progress: 1379 on 8630  Progress: 1380 on 8630  Progress: 1381 on 8630  Progress: 1382 on 8630  Progress: 1383 on 8630  Progress: 1384 on 8630  Progress: 1385 on 8630  Progress: 1386 on 8630  Progress: 1387 on 8630  Progress: 1388 on 8630  Progress: 1389 on 8630  Progress: 1390 on 8630  Progress: 1391 on 8630  Progress: 1392 on 8630  Progress: 1393 on 8630  Progress: 1394 on 8630  Progress: 1395 on 8630  Progress: 1396 on 8630  Progress: 1397 on 8630  Progress: 1398 on 8630  Progress: 1399 on 8630  Progress: 1400 on 8630  Progress: 1401 on 8630  Progress: 1402 on 8630  Progress: 1403 on 8630  Progress: 1404 on 8630  Progress: 1405 on 8630  Progress: 1406 on 8630  Progress: 1407 on 8630  Progress: 1408 on 8630  Progress: 1409 on 8630  Progress: 1410 on 8630  Progress: 1411 on 8630  Progress: 1412 on 8630  Progress: 1413 on 8630  Progress: 1414 on 8630  Progress: 1415 on 8630  Progress: 1416 on 8630  Progress: 1417 on 8630  Progress: 1418 on 8630  Progress: 1419 on 8630  Progress: 1420 on 8630  Progress: 1421 on 8630  Progress: 1422 on 8630  Progress: 1423 on 8630  Progress: 1424 on 8630  Progress: 1425 on 8630  Progress: 1426 on 8630  Progress: 1427 on 8630  Progress: 1428 on 8630  Progress: 1429 on 8630  Progress: 1430 on 8630  Progress: 1431 on 8630  Progress: 1432 on 8630  Progress: 1433 on 8630  Progress: 1434 on 8630  Progress: 1435 on 8630  Progress: 1436 on 8630  Progress: 1437 on 8630  Progress: 1438 on 8630  Progress: 1439 on 8630  Progress: 1440 on 8630  Progress: 1441 on 8630  Progress: 1442 on 8630  Progress: 1443 on 8630  Progress: 1444 on 8630  Progress: 1445 on 8630  Progress: 1446 on 8630  Progress: 1447 on 8630  Progress: 1448 on 8630  Progress: 1449 on 8630  Progress: 1450 on 8630  Progress: 1451 on 8630  Progress: 1452 on 8630  Progress: 1453 on 8630  Progress: 1454 on 8630  Progress: 1455 on 8630  Progress: 1456 on 8630  Progress: 1457 on 8630  Progress: 1458 on 8630  Progress: 1459 on 8630  Progress: 1460 on 8630  Progress: 1461 on 8630  Progress: 1462 on 8630  Progress: 1463 on 8630  Progress: 1464 on 8630  Progress: 1465 on 8630  Progress: 1466 on 8630  Progress: 1467 on 8630  Progress: 1468 on 8630  Progress: 1469 on 8630  Progress: 1470 on 8630  Progress: 1471 on 8630  Progress: 1472 on 8630  Progress: 1473 on 8630  Progress: 1474 on 8630  Progress: 1475 on 8630  Progress: 1476 on 8630  Progress: 1477 on 8630  Progress: 1478 on 8630  Progress: 1479 on 8630  Progress: 1480 on 8630  Progress: 1481 on 8630  Progress: 1482 on 8630  Progress: 1483 on 8630  Progress: 1484 on 8630  Progress: 1485 on 8630  Progress: 1486 on 8630  Progress: 1487 on 8630  Progress: 1488 on 8630  Progress: 1489 on 8630  Progress: 1490 on 8630  Progress: 1491 on 8630  Progress: 1492 on 8630  Progress: 1493 on 8630  Progress: 1494 on 8630  Progress: 1495 on 8630  Progress: 1496 on 8630  Progress: 1497 on 8630  Progress: 1498 on 8630  Progress: 1499 on 8630  Progress: 1500 on 8630  Progress: 1501 on 8630  Progress: 1502 on 8630  Progress: 1503 on 8630  Progress: 1504 on 8630  Progress: 1505 on 8630  Progress: 1506 on 8630  Progress: 1507 on 8630  Progress: 1508 on 8630  Progress: 1509 on 8630  Progress: 1510 on 8630  Progress: 1511 on 8630  Progress: 1512 on 8630  Progress: 1513 on 8630  Progress: 1514 on 8630  Progress: 1515 on 8630  Progress: 1516 on 8630  Progress: 1517 on 8630  Progress: 1518 on 8630  Progress: 1519 on 8630  Progress: 1520 on 8630  Progress: 1521 on 8630  Progress: 1522 on 8630  Progress: 1523 on 8630  Progress: 1524 on 8630  Progress: 1525 on 8630  Progress: 1526 on 8630  Progress: 1527 on 8630  Progress: 1528 on 8630  Progress: 1529 on 8630  Progress: 1530 on 8630  Progress: 1531 on 8630  Progress: 1532 on 8630  Progress: 1533 on 8630  Progress: 1534 on 8630  Progress: 1535 on 8630  Progress: 1536 on 8630  Progress: 1537 on 8630  Progress: 1538 on 8630  Progress: 1539 on 8630  Progress: 1540 on 8630  Progress: 1541 on 8630  Progress: 1542 on 8630  Progress: 1543 on 8630  Progress: 1544 on 8630  Progress: 1545 on 8630  Progress: 1546 on 8630  Progress: 1547 on 8630  Progress: 1548 on 8630  Progress: 1549 on 8630  Progress: 1550 on 8630  Progress: 1551 on 8630  Progress: 1552 on 8630  Progress: 1553 on 8630  Progress: 1554 on 8630  Progress: 1555 on 8630  Progress: 1556 on 8630  Progress: 1557 on 8630  Progress: 1558 on 8630  Progress: 1559 on 8630  Progress: 1560 on 8630  Progress: 1561 on 8630  Progress: 1562 on 8630  Progress: 1563 on 8630  Progress: 1564 on 8630  Progress: 1565 on 8630  Progress: 1566 on 8630  Progress: 1567 on 8630  Progress: 1568 on 8630  Progress: 1569 on 8630  Progress: 1570 on 8630  Progress: 1571 on 8630  Progress: 1572 on 8630  Progress: 1573 on 8630  Progress: 1574 on 8630  Progress: 1575 on 8630  Progress: 1576 on 8630  Progress: 1577 on 8630  Progress: 1578 on 8630  Progress: 1579 on 8630  Progress: 1580 on 8630  Progress: 1581 on 8630  Progress: 1582 on 8630  Progress: 1583 on 8630  Progress: 1584 on 8630  Progress: 1585 on 8630  Progress: 1586 on 8630  Progress: 1587 on 8630  Progress: 1588 on 8630  Progress: 1589 on 8630  Progress: 1590 on 8630  Progress: 1591 on 8630  Progress: 1592 on 8630  Progress: 1593 on 8630  Progress: 1594 on 8630  Progress: 1595 on 8630  Progress: 1596 on 8630  Progress: 1597 on 8630  Progress: 1598 on 8630  Progress: 1599 on 8630  Progress: 1600 on 8630  Progress: 1601 on 8630  Progress: 1602 on 8630  Progress: 1603 on 8630  Progress: 1604 on 8630  Progress: 1605 on 8630  Progress: 1606 on 8630  Progress: 1607 on 8630  Progress: 1608 on 8630  Progress: 1609 on 8630  Progress: 1610 on 8630  Progress: 1611 on 8630  Progress: 1612 on 8630  Progress: 1613 on 8630  Progress: 1614 on 8630  Progress: 1615 on 8630  Progress: 1616 on 8630  Progress: 1617 on 8630  Progress: 1618 on 8630  Progress: 1619 on 8630  Progress: 1620 on 8630  Progress: 1621 on 8630  Progress: 1622 on 8630  Progress: 1623 on 8630  Progress: 1624 on 8630  Progress: 1625 on 8630  Progress: 1626 on 8630  Progress: 1627 on 8630  Progress: 1628 on 8630  Progress: 1629 on 8630  Progress: 1630 on 8630  Progress: 1631 on 8630  Progress: 1632 on 8630  Progress: 1633 on 8630  Progress: 1634 on 8630  Progress: 1635 on 8630  Progress: 1636 on 8630  Progress: 1637 on 8630  Progress: 1638 on 8630  Progress: 1639 on 8630  Progress: 1640 on 8630  Progress: 1641 on 8630  Progress: 1642 on 8630  Progress: 1643 on 8630  Progress: 1644 on 8630  Progress: 1645 on 8630  Progress: 1646 on 8630  Progress: 1647 on 8630  Progress: 1648 on 8630  Progress: 1649 on 8630  Progress: 1650 on 8630  Progress: 1651 on 8630  Progress: 1652 on 8630  Progress: 1653 on 8630  Progress: 1654 on 8630  Progress: 1655 on 8630  Progress: 1656 on 8630  Progress: 1657 on 8630  Progress: 1658 on 8630  Progress: 1659 on 8630  Progress: 1660 on 8630  Progress: 1661 on 8630  Progress: 1662 on 8630  Progress: 1663 on 8630  Progress: 1664 on 8630  Progress: 1665 on 8630  Progress: 1666 on 8630  Progress: 1667 on 8630  Progress: 1668 on 8630  Progress: 1669 on 8630  Progress: 1670 on 8630  Progress: 1671 on 8630  Progress: 1672 on 8630  Progress: 1673 on 8630  Progress: 1674 on 8630  Progress: 1675 on 8630  Progress: 1676 on 8630  Progress: 1677 on 8630  Progress: 1678 on 8630  Progress: 1679 on 8630  Progress: 1680 on 8630  Progress: 1681 on 8630  Progress: 1682 on 8630  Progress: 1683 on 8630  Progress: 1684 on 8630  Progress: 1685 on 8630  Progress: 1686 on 8630  Progress: 1687 on 8630  Progress: 1688 on 8630  Progress: 1689 on 8630  Progress: 1690 on 8630  Progress: 1691 on 8630  Progress: 1692 on 8630  Progress: 1693 on 8630  Progress: 1694 on 8630  Progress: 1695 on 8630  Progress: 1696 on 8630  Progress: 1697 on 8630  Progress: 1698 on 8630  Progress: 1699 on 8630  Progress: 1700 on 8630  Progress: 1701 on 8630  Progress: 1702 on 8630  Progress: 1703 on 8630  Progress: 1704 on 8630  Progress: 1705 on 8630  Progress: 1706 on 8630  Progress: 1707 on 8630  Progress: 1708 on 8630  Progress: 1709 on 8630  Progress: 1710 on 8630  Progress: 1711 on 8630  Progress: 1712 on 8630  Progress: 1713 on 8630  Progress: 1714 on 8630  Progress: 1715 on 8630  Progress: 1716 on 8630  Progress: 1717 on 8630  Progress: 1718 on 8630  Progress: 1719 on 8630  Progress: 1720 on 8630  Progress: 1721 on 8630  Progress: 1722 on 8630  Progress: 1723 on 8630  Progress: 1724 on 8630  Progress: 1725 on 8630  Progress: 1726 on 8630  Progress: 1727 on 8630  Progress: 1728 on 8630  Progress: 1729 on 8630  Progress: 1730 on 8630  Progress: 1731 on 8630  Progress: 1732 on 8630  Progress: 1733 on 8630  Progress: 1734 on 8630  Progress: 1735 on 8630  Progress: 1736 on 8630  Progress: 1737 on 8630  Progress: 1738 on 8630  Progress: 1739 on 8630  Progress: 1740 on 8630  Progress: 1741 on 8630  Progress: 1742 on 8630  Progress: 1743 on 8630  Progress: 1744 on 8630  Progress: 1745 on 8630  Progress: 1746 on 8630  Progress: 1747 on 8630  Progress: 1748 on 8630  Progress: 1749 on 8630  Progress: 1750 on 8630  Progress: 1751 on 8630  Progress: 1752 on 8630  Progress: 1753 on 8630  Progress: 1754 on 8630  Progress: 1755 on 8630  Progress: 1756 on 8630  Progress: 1757 on 8630  Progress: 1758 on 8630  Progress: 1759 on 8630  Progress: 1760 on 8630  Progress: 1761 on 8630  Progress: 1762 on 8630  Progress: 1763 on 8630  Progress: 1764 on 8630  Progress: 1765 on 8630  Progress: 1766 on 8630  Progress: 1767 on 8630  Progress: 1768 on 8630  Progress: 1769 on 8630  Progress: 1770 on 8630  Progress: 1771 on 8630  Progress: 1772 on 8630  Progress: 1773 on 8630  Progress: 1774 on 8630  Progress: 1775 on 8630  Progress: 1776 on 8630  Progress: 1777 on 8630  Progress: 1778 on 8630  Progress: 1779 on 8630  Progress: 1780 on 8630  Progress: 1781 on 8630  Progress: 1782 on 8630  Progress: 1783 on 8630  Progress: 1784 on 8630  Progress: 1785 on 8630  Progress: 1786 on 8630  Progress: 1787 on 8630  Progress: 1788 on 8630  Progress: 1789 on 8630  Progress: 1790 on 8630  Progress: 1791 on 8630  Progress: 1792 on 8630  Progress: 1793 on 8630  Progress: 1794 on 8630  Progress: 1795 on 8630  Progress: 1796 on 8630  Progress: 1797 on 8630  Progress: 1798 on 8630  Progress: 1799 on 8630  Progress: 1800 on 8630  Progress: 1801 on 8630  Progress: 1802 on 8630  Progress: 1803 on 8630  Progress: 1804 on 8630  Progress: 1805 on 8630  Progress: 1806 on 8630  Progress: 1807 on 8630  Progress: 1808 on 8630  Progress: 1809 on 8630  Progress: 1810 on 8630  Progress: 1811 on 8630  Progress: 1812 on 8630  Progress: 1813 on 8630  Progress: 1814 on 8630  Progress: 1815 on 8630  Progress: 1816 on 8630  Progress: 1817 on 8630  Progress: 1818 on 8630  Progress: 1819 on 8630  Progress: 1820 on 8630  Progress: 1821 on 8630  Progress: 1822 on 8630  Progress: 1823 on 8630  Progress: 1824 on 8630  Progress: 1825 on 8630  Progress: 1826 on 8630  Progress: 1827 on 8630  Progress: 1828 on 8630  Progress: 1829 on 8630  Progress: 1830 on 8630  Progress: 1831 on 8630  Progress: 1832 on 8630  Progress: 1833 on 8630  Progress: 1834 on 8630  Progress: 1835 on 8630  Progress: 1836 on 8630  Progress: 1837 on 8630  Progress: 1838 on 8630  Progress: 1839 on 8630  Progress: 1840 on 8630  Progress: 1841 on 8630  Progress: 1842 on 8630  Progress: 1843 on 8630  Progress: 1844 on 8630  Progress: 1845 on 8630  Progress: 1846 on 8630  Progress: 1847 on 8630  Progress: 1848 on 8630  Progress: 1849 on 8630  Progress: 1850 on 8630  Progress: 1851 on 8630  Progress: 1852 on 8630  Progress: 1853 on 8630  Progress: 1854 on 8630  Progress: 1855 on 8630  Progress: 1856 on 8630  Progress: 1857 on 8630  Progress: 1858 on 8630  Progress: 1859 on 8630  Progress: 1860 on 8630  Progress: 1861 on 8630  Progress: 1862 on 8630  Progress: 1863 on 8630  Progress: 1864 on 8630  Progress: 1865 on 8630  Progress: 1866 on 8630  Progress: 1867 on 8630  Progress: 1868 on 8630  Progress: 1869 on 8630  Progress: 1870 on 8630  Progress: 1871 on 8630  Progress: 1872 on 8630  Progress: 1873 on 8630  Progress: 1874 on 8630  Progress: 1875 on 8630  Progress: 1876 on 8630  Progress: 1877 on 8630  Progress: 1878 on 8630  Progress: 1879 on 8630  Progress: 1880 on 8630  Progress: 1881 on 8630  Progress: 1882 on 8630  Progress: 1883 on 8630  Progress: 1884 on 8630  Progress: 1885 on 8630  Progress: 1886 on 8630  Progress: 1887 on 8630  Progress: 1888 on 8630  Progress: 1889 on 8630  Progress: 1890 on 8630  Progress: 1891 on 8630  Progress: 1892 on 8630  Progress: 1893 on 8630  Progress: 1894 on 8630  Progress: 1895 on 8630  Progress: 1896 on 8630  Progress: 1897 on 8630  Progress: 1898 on 8630  Progress: 1899 on 8630  Progress: 1900 on 8630  Progress: 1901 on 8630  Progress: 1902 on 8630  Progress: 1903 on 8630  Progress: 1904 on 8630  Progress: 1905 on 8630  Progress: 1906 on 8630  Progress: 1907 on 8630  Progress: 1908 on 8630  Progress: 1909 on 8630  Progress: 1910 on 8630  Progress: 1911 on 8630  Progress: 1912 on 8630  Progress: 1913 on 8630  Progress: 1914 on 8630  Progress: 1915 on 8630  Progress: 1916 on 8630  Progress: 1917 on 8630  Progress: 1918 on 8630  Progress: 1919 on 8630  Progress: 1920 on 8630  Progress: 1921 on 8630  Progress: 1922 on 8630  Progress: 1923 on 8630  Progress: 1924 on 8630  Progress: 1925 on 8630  Progress: 1926 on 8630  Progress: 1927 on 8630  Progress: 1928 on 8630  Progress: 1929 on 8630  Progress: 1930 on 8630  Progress: 1931 on 8630  Progress: 1932 on 8630  Progress: 1933 on 8630  Progress: 1934 on 8630  Progress: 1935 on 8630  Progress: 1936 on 8630  Progress: 1937 on 8630  Progress: 1938 on 8630  Progress: 1939 on 8630  Progress: 1940 on 8630  Progress: 1941 on 8630  Progress: 1942 on 8630  Progress: 1943 on 8630  Progress: 1944 on 8630  Progress: 1945 on 8630  Progress: 1946 on 8630  Progress: 1947 on 8630  Progress: 1948 on 8630  Progress: 1949 on 8630  Progress: 1950 on 8630  Progress: 1951 on 8630  Progress: 1952 on 8630  Progress: 1953 on 8630  Progress: 1954 on 8630  Progress: 1955 on 8630  Progress: 1956 on 8630  Progress: 1957 on 8630  Progress: 1958 on 8630  Progress: 1959 on 8630  Progress: 1960 on 8630  Progress: 1961 on 8630  Progress: 1962 on 8630  Progress: 1963 on 8630  Progress: 1964 on 8630  Progress: 1965 on 8630  Progress: 1966 on 8630  Progress: 1967 on 8630  Progress: 1968 on 8630  Progress: 1969 on 8630  Progress: 1970 on 8630  Progress: 1971 on 8630  Progress: 1972 on 8630  Progress: 1973 on 8630  Progress: 1974 on 8630  Progress: 1975 on 8630  Progress: 1976 on 8630  Progress: 1977 on 8630  Progress: 1978 on 8630  Progress: 1979 on 8630  Progress: 1980 on 8630  Progress: 1981 on 8630  Progress: 1982 on 8630  Progress: 1983 on 8630  Progress: 1984 on 8630  Progress: 1985 on 8630  Progress: 1986 on 8630  Progress: 1987 on 8630  Progress: 1988 on 8630  Progress: 1989 on 8630  Progress: 1990 on 8630  Progress: 1991 on 8630  Progress: 1992 on 8630  Progress: 1993 on 8630  Progress: 1994 on 8630  Progress: 1995 on 8630  Progress: 1996 on 8630  Progress: 1997 on 8630  Progress: 1998 on 8630  Progress: 1999 on 8630  Progress: 2000 on 8630  Progress: 2001 on 8630  Progress: 2002 on 8630  Progress: 2003 on 8630  Progress: 2004 on 8630  Progress: 2005 on 8630  Progress: 2006 on 8630  Progress: 2007 on 8630  Progress: 2008 on 8630  Progress: 2009 on 8630  Progress: 2010 on 8630  Progress: 2011 on 8630  Progress: 2012 on 8630  Progress: 2013 on 8630  Progress: 2014 on 8630  Progress: 2015 on 8630  Progress: 2016 on 8630  Progress: 2017 on 8630  Progress: 2018 on 8630  Progress: 2019 on 8630  Progress: 2020 on 8630  Progress: 2021 on 8630  Progress: 2022 on 8630  Progress: 2023 on 8630  Progress: 2024 on 8630  Progress: 2025 on 8630  Progress: 2026 on 8630  Progress: 2027 on 8630  Progress: 2028 on 8630  Progress: 2029 on 8630  Progress: 2030 on 8630  Progress: 2031 on 8630  Progress: 2032 on 8630  Progress: 2033 on 8630  Progress: 2034 on 8630  Progress: 2035 on 8630  Progress: 2036 on 8630  Progress: 2037 on 8630  Progress: 2038 on 8630  Progress: 2039 on 8630  Progress: 2040 on 8630  Progress: 2041 on 8630  Progress: 2042 on 8630  Progress: 2043 on 8630  Progress: 2044 on 8630  Progress: 2045 on 8630  Progress: 2046 on 8630  Progress: 2047 on 8630  Progress: 2048 on 8630  Progress: 2049 on 8630  Progress: 2050 on 8630  Progress: 2051 on 8630  Progress: 2052 on 8630  Progress: 2053 on 8630  Progress: 2054 on 8630  Progress: 2055 on 8630  Progress: 2056 on 8630  Progress: 2057 on 8630  Progress: 2058 on 8630  Progress: 2059 on 8630  Progress: 2060 on 8630  Progress: 2061 on 8630  Progress: 2062 on 8630  Progress: 2063 on 8630  Progress: 2064 on 8630  Progress: 2065 on 8630  Progress: 2066 on 8630  Progress: 2067 on 8630  Progress: 2068 on 8630  Progress: 2069 on 8630  Progress: 2070 on 8630  Progress: 2071 on 8630  Progress: 2072 on 8630  Progress: 2073 on 8630  Progress: 2074 on 8630  Progress: 2075 on 8630  Progress: 2076 on 8630  Progress: 2077 on 8630  Progress: 2078 on 8630  Progress: 2079 on 8630  Progress: 2080 on 8630  Progress: 2081 on 8630  Progress: 2082 on 8630  Progress: 2083 on 8630  Progress: 2084 on 8630  Progress: 2085 on 8630  Progress: 2086 on 8630  Progress: 2087 on 8630  Progress: 2088 on 8630  Progress: 2089 on 8630  Progress: 2090 on 8630  Progress: 2091 on 8630  Progress: 2092 on 8630  Progress: 2093 on 8630  Progress: 2094 on 8630  Progress: 2095 on 8630  Progress: 2096 on 8630  Progress: 2097 on 8630  Progress: 2098 on 8630  Progress: 2099 on 8630  Progress: 2100 on 8630  Progress: 2101 on 8630  Progress: 2102 on 8630  Progress: 2103 on 8630  Progress: 2104 on 8630  Progress: 2105 on 8630  Progress: 2106 on 8630  Progress: 2107 on 8630  Progress: 2108 on 8630  Progress: 2109 on 8630  Progress: 2110 on 8630  Progress: 2111 on 8630  Progress: 2112 on 8630  Progress: 2113 on 8630  Progress: 2114 on 8630  Progress: 2115 on 8630  Progress: 2116 on 8630  Progress: 2117 on 8630  Progress: 2118 on 8630  Progress: 2119 on 8630  Progress: 2120 on 8630  Progress: 2121 on 8630  Progress: 2122 on 8630  Progress: 2123 on 8630  Progress: 2124 on 8630  Progress: 2125 on 8630  Progress: 2126 on 8630  Progress: 2127 on 8630  Progress: 2128 on 8630  Progress: 2129 on 8630  Progress: 2130 on 8630  Progress: 2131 on 8630  Progress: 2132 on 8630  Progress: 2133 on 8630  Progress: 2134 on 8630  Progress: 2135 on 8630  Progress: 2136 on 8630  Progress: 2137 on 8630  Progress: 2138 on 8630  Progress: 2139 on 8630  Progress: 2140 on 8630  Progress: 2141 on 8630  Progress: 2142 on 8630  Progress: 2143 on 8630  Progress: 2144 on 8630  Progress: 2145 on 8630  Progress: 2146 on 8630  Progress: 2147 on 8630  Progress: 2148 on 8630  Progress: 2149 on 8630  Progress: 2150 on 8630  Progress: 2151 on 8630  Progress: 2152 on 8630  Progress: 2153 on 8630  Progress: 2154 on 8630  Progress: 2155 on 8630  Progress: 2156 on 8630  Progress: 2157 on 8630  Progress: 2158 on 8630  Progress: 2159 on 8630  Progress: 2160 on 8630  Progress: 2161 on 8630  Progress: 2162 on 8630  Progress: 2163 on 8630  Progress: 2164 on 8630  Progress: 2165 on 8630  Progress: 2166 on 8630  Progress: 2167 on 8630  Progress: 2168 on 8630  Progress: 2169 on 8630  Progress: 2170 on 8630  Progress: 2171 on 8630  Progress: 2172 on 8630  Progress: 2173 on 8630  Progress: 2174 on 8630  Progress: 2175 on 8630  Progress: 2176 on 8630  Progress: 2177 on 8630  Progress: 2178 on 8630  Progress: 2179 on 8630  Progress: 2180 on 8630  Progress: 2181 on 8630  Progress: 2182 on 8630  Progress: 2183 on 8630  Progress: 2184 on 8630  Progress: 2185 on 8630  Progress: 2186 on 8630  Progress: 2187 on 8630  Progress: 2188 on 8630  Progress: 2189 on 8630  Progress: 2190 on 8630  Progress: 2191 on 8630  Progress: 2192 on 8630  Progress: 2193 on 8630  Progress: 2194 on 8630  Progress: 2195 on 8630  Progress: 2196 on 8630  Progress: 2197 on 8630  Progress: 2198 on 8630  Progress: 2199 on 8630  Progress: 2200 on 8630  Progress: 2201 on 8630  Progress: 2202 on 8630  Progress: 2203 on 8630  Progress: 2204 on 8630  Progress: 2205 on 8630  Progress: 2206 on 8630  Progress: 2207 on 8630  Progress: 2208 on 8630  Progress: 2209 on 8630  Progress: 2210 on 8630  Progress: 2211 on 8630  Progress: 2212 on 8630  Progress: 2213 on 8630  Progress: 2214 on 8630  Progress: 2215 on 8630  Progress: 2216 on 8630  Progress: 2217 on 8630  Progress: 2218 on 8630  Progress: 2219 on 8630  Progress: 2220 on 8630  Progress: 2221 on 8630  Progress: 2222 on 8630  Progress: 2223 on 8630  Progress: 2224 on 8630  Progress: 2225 on 8630  Progress: 2226 on 8630  Progress: 2227 on 8630  Progress: 2228 on 8630  Progress: 2229 on 8630  Progress: 2230 on 8630  Progress: 2231 on 8630  Progress: 2232 on 8630  Progress: 2233 on 8630  Progress: 2234 on 8630  Progress: 2235 on 8630  Progress: 2236 on 8630  Progress: 2237 on 8630  Progress: 2238 on 8630  Progress: 2239 on 8630  Progress: 2240 on 8630  Progress: 2241 on 8630  Progress: 2242 on 8630  Progress: 2243 on 8630  Progress: 2244 on 8630  Progress: 2245 on 8630  Progress: 2246 on 8630  Progress: 2247 on 8630  Progress: 2248 on 8630  Progress: 2249 on 8630  Progress: 2250 on 8630  Progress: 2251 on 8630  Progress: 2252 on 8630  Progress: 2253 on 8630  Progress: 2254 on 8630  Progress: 2255 on 8630  Progress: 2256 on 8630  Progress: 2257 on 8630  Progress: 2258 on 8630  Progress: 2259 on 8630  Progress: 2260 on 8630  Progress: 2261 on 8630  Progress: 2262 on 8630  Progress: 2263 on 8630  Progress: 2264 on 8630  Progress: 2265 on 8630  Progress: 2266 on 8630  Progress: 2267 on 8630  Progress: 2268 on 8630  Progress: 2269 on 8630  Progress: 2270 on 8630  Progress: 2271 on 8630  Progress: 2272 on 8630  Progress: 2273 on 8630  Progress: 2274 on 8630  Progress: 2275 on 8630  Progress: 2276 on 8630  Progress: 2277 on 8630  Progress: 2278 on 8630  Progress: 2279 on 8630  Progress: 2280 on 8630  Progress: 2281 on 8630  Progress: 2282 on 8630  Progress: 2283 on 8630  Progress: 2284 on 8630  Progress: 2285 on 8630  Progress: 2286 on 8630  Progress: 2287 on 8630  Progress: 2288 on 8630  Progress: 2289 on 8630  Progress: 2290 on 8630  Progress: 2291 on 8630  Progress: 2292 on 8630  Progress: 2293 on 8630  Progress: 2294 on 8630  Progress: 2295 on 8630  Progress: 2296 on 8630  Progress: 2297 on 8630  Progress: 2298 on 8630  Progress: 2299 on 8630  Progress: 2300 on 8630  Progress: 2301 on 8630  Progress: 2302 on 8630  Progress: 2303 on 8630  Progress: 2304 on 8630  Progress: 2305 on 8630  Progress: 2306 on 8630  Progress: 2307 on 8630  Progress: 2308 on 8630  Progress: 2309 on 8630  Progress: 2310 on 8630  Progress: 2311 on 8630  Progress: 2312 on 8630  Progress: 2313 on 8630  Progress: 2314 on 8630  Progress: 2315 on 8630  Progress: 2316 on 8630  Progress: 2317 on 8630  Progress: 2318 on 8630  Progress: 2319 on 8630  Progress: 2320 on 8630  Progress: 2321 on 8630  Progress: 2322 on 8630  Progress: 2323 on 8630  Progress: 2324 on 8630  Progress: 2325 on 8630  Progress: 2326 on 8630  Progress: 2327 on 8630  Progress: 2328 on 8630  Progress: 2329 on 8630  Progress: 2330 on 8630  Progress: 2331 on 8630  Progress: 2332 on 8630  Progress: 2333 on 8630  Progress: 2334 on 8630  Progress: 2335 on 8630  Progress: 2336 on 8630  Progress: 2337 on 8630  Progress: 2338 on 8630  Progress: 2339 on 8630  Progress: 2340 on 8630  Progress: 2341 on 8630  Progress: 2342 on 8630  Progress: 2343 on 8630  Progress: 2344 on 8630  Progress: 2345 on 8630  Progress: 2346 on 8630  Progress: 2347 on 8630  Progress: 2348 on 8630  Progress: 2349 on 8630  Progress: 2350 on 8630  Progress: 2351 on 8630  Progress: 2352 on 8630  Progress: 2353 on 8630  Progress: 2354 on 8630  Progress: 2355 on 8630  Progress: 2356 on 8630  Progress: 2357 on 8630  Progress: 2358 on 8630  Progress: 2359 on 8630  Progress: 2360 on 8630  Progress: 2361 on 8630  Progress: 2362 on 8630  Progress: 2363 on 8630  Progress: 2364 on 8630  Progress: 2365 on 8630  Progress: 2366 on 8630  Progress: 2367 on 8630  Progress: 2368 on 8630  Progress: 2369 on 8630  Progress: 2370 on 8630  Progress: 2371 on 8630  Progress: 2372 on 8630  Progress: 2373 on 8630  Progress: 2374 on 8630  Progress: 2375 on 8630  Progress: 2376 on 8630  Progress: 2377 on 8630  Progress: 2378 on 8630  Progress: 2379 on 8630  Progress: 2380 on 8630  Progress: 2381 on 8630  Progress: 2382 on 8630  Progress: 2383 on 8630  Progress: 2384 on 8630  Progress: 2385 on 8630  Progress: 2386 on 8630  Progress: 2387 on 8630  Progress: 2388 on 8630  Progress: 2389 on 8630  Progress: 2390 on 8630  Progress: 2391 on 8630  Progress: 2392 on 8630  Progress: 2393 on 8630  Progress: 2394 on 8630  Progress: 2395 on 8630  Progress: 2396 on 8630  Progress: 2397 on 8630  Progress: 2398 on 8630  Progress: 2399 on 8630  Progress: 2400 on 8630  Progress: 2401 on 8630  Progress: 2402 on 8630  Progress: 2403 on 8630  Progress: 2404 on 8630  Progress: 2405 on 8630  Progress: 2406 on 8630  Progress: 2407 on 8630  Progress: 2408 on 8630  Progress: 2409 on 8630  Progress: 2410 on 8630  Progress: 2411 on 8630  Progress: 2412 on 8630  Progress: 2413 on 8630  Progress: 2414 on 8630  Progress: 2415 on 8630  Progress: 2416 on 8630  Progress: 2417 on 8630  Progress: 2418 on 8630  Progress: 2419 on 8630  Progress: 2420 on 8630  Progress: 2421 on 8630  Progress: 2422 on 8630  Progress: 2423 on 8630  Progress: 2424 on 8630  Progress: 2425 on 8630  Progress: 2426 on 8630  Progress: 2427 on 8630  Progress: 2428 on 8630  Progress: 2429 on 8630  Progress: 2430 on 8630  Progress: 2431 on 8630  Progress: 2432 on 8630  Progress: 2433 on 8630  Progress: 2434 on 8630  Progress: 2435 on 8630  Progress: 2436 on 8630  Progress: 2437 on 8630  Progress: 2438 on 8630  Progress: 2439 on 8630  Progress: 2440 on 8630  Progress: 2441 on 8630  Progress: 2442 on 8630  Progress: 2443 on 8630  Progress: 2444 on 8630  Progress: 2445 on 8630  Progress: 2446 on 8630  Progress: 2447 on 8630  Progress: 2448 on 8630  Progress: 2449 on 8630  Progress: 2450 on 8630  Progress: 2451 on 8630  Progress: 2452 on 8630  Progress: 2453 on 8630  Progress: 2454 on 8630  Progress: 2455 on 8630  Progress: 2456 on 8630  Progress: 2457 on 8630  Progress: 2458 on 8630  Progress: 2459 on 8630  Progress: 2460 on 8630  Progress: 2461 on 8630  Progress: 2462 on 8630  Progress: 2463 on 8630  Progress: 2464 on 8630  Progress: 2465 on 8630  Progress: 2466 on 8630  Progress: 2467 on 8630  Progress: 2468 on 8630  Progress: 2469 on 8630  Progress: 2470 on 8630  Progress: 2471 on 8630  Progress: 2472 on 8630  Progress: 2473 on 8630  Progress: 2474 on 8630  Progress: 2475 on 8630  Progress: 2476 on 8630  Progress: 2477 on 8630  Progress: 2478 on 8630  Progress: 2479 on 8630  Progress: 2480 on 8630  Progress: 2481 on 8630  Progress: 2482 on 8630  Progress: 2483 on 8630  Progress: 2484 on 8630  Progress: 2485 on 8630  Progress: 2486 on 8630  Progress: 2487 on 8630  Progress: 2488 on 8630  Progress: 2489 on 8630  Progress: 2490 on 8630  Progress: 2491 on 8630  Progress: 2492 on 8630  Progress: 2493 on 8630  Progress: 2494 on 8630  Progress: 2495 on 8630  Progress: 2496 on 8630  Progress: 2497 on 8630  Progress: 2498 on 8630  Progress: 2499 on 8630  Progress: 2500 on 8630  Progress: 2501 on 8630  Progress: 2502 on 8630  Progress: 2503 on 8630  Progress: 2504 on 8630  Progress: 2505 on 8630  Progress: 2506 on 8630  Progress: 2507 on 8630  Progress: 2508 on 8630  Progress: 2509 on 8630  Progress: 2510 on 8630  Progress: 2511 on 8630  Progress: 2512 on 8630  Progress: 2513 on 8630  Progress: 2514 on 8630  Progress: 2515 on 8630  Progress: 2516 on 8630  Progress: 2517 on 8630  Progress: 2518 on 8630  Progress: 2519 on 8630  Progress: 2520 on 8630  Progress: 2521 on 8630  Progress: 2522 on 8630  Progress: 2523 on 8630  Progress: 2524 on 8630  Progress: 2525 on 8630  Progress: 2526 on 8630  Progress: 2527 on 8630  Progress: 2528 on 8630  Progress: 2529 on 8630  Progress: 2530 on 8630  Progress: 2531 on 8630  Progress: 2532 on 8630  Progress: 2533 on 8630  Progress: 2534 on 8630  Progress: 2535 on 8630  Progress: 2536 on 8630  Progress: 2537 on 8630  Progress: 2538 on 8630  Progress: 2539 on 8630  Progress: 2540 on 8630  Progress: 2541 on 8630  Progress: 2542 on 8630  Progress: 2543 on 8630  Progress: 2544 on 8630  Progress: 2545 on 8630  Progress: 2546 on 8630  Progress: 2547 on 8630  Progress: 2548 on 8630  Progress: 2549 on 8630  Progress: 2550 on 8630  Progress: 2551 on 8630  Progress: 2552 on 8630  Progress: 2553 on 8630  Progress: 2554 on 8630  Progress: 2555 on 8630  Progress: 2556 on 8630  Progress: 2557 on 8630  Progress: 2558 on 8630  Progress: 2559 on 8630  Progress: 2560 on 8630  Progress: 2561 on 8630  Progress: 2562 on 8630  Progress: 2563 on 8630  Progress: 2564 on 8630  Progress: 2565 on 8630  Progress: 2566 on 8630  Progress: 2567 on 8630  Progress: 2568 on 8630  Progress: 2569 on 8630  Progress: 2570 on 8630  Progress: 2571 on 8630  Progress: 2572 on 8630  Progress: 2573 on 8630  Progress: 2574 on 8630  Progress: 2575 on 8630  Progress: 2576 on 8630  Progress: 2577 on 8630  Progress: 2578 on 8630  Progress: 2579 on 8630  Progress: 2580 on 8630  Progress: 2581 on 8630  Progress: 2582 on 8630  Progress: 2583 on 8630  Progress: 2584 on 8630  Progress: 2585 on 8630  Progress: 2586 on 8630  Progress: 2587 on 8630  Progress: 2588 on 8630  Progress: 2589 on 8630  Progress: 2590 on 8630  Progress: 2591 on 8630  Progress: 2592 on 8630  Progress: 2593 on 8630  Progress: 2594 on 8630  Progress: 2595 on 8630  Progress: 2596 on 8630  Progress: 2597 on 8630  Progress: 2598 on 8630  Progress: 2599 on 8630  Progress: 2600 on 8630  Progress: 2601 on 8630  Progress: 2602 on 8630  Progress: 2603 on 8630  Progress: 2604 on 8630  Progress: 2605 on 8630  Progress: 2606 on 8630  Progress: 2607 on 8630  Progress: 2608 on 8630  Progress: 2609 on 8630  Progress: 2610 on 8630  Progress: 2611 on 8630  Progress: 2612 on 8630  Progress: 2613 on 8630  Progress: 2614 on 8630  Progress: 2615 on 8630  Progress: 2616 on 8630  Progress: 2617 on 8630  Progress: 2618 on 8630  Progress: 2619 on 8630  Progress: 2620 on 8630  Progress: 2621 on 8630  Progress: 2622 on 8630  Progress: 2623 on 8630  Progress: 2624 on 8630  Progress: 2625 on 8630  Progress: 2626 on 8630  Progress: 2627 on 8630  Progress: 2628 on 8630  Progress: 2629 on 8630  Progress: 2630 on 8630  Progress: 2631 on 8630  Progress: 2632 on 8630  Progress: 2633 on 8630  Progress: 2634 on 8630  Progress: 2635 on 8630  Progress: 2636 on 8630  Progress: 2637 on 8630  Progress: 2638 on 8630  Progress: 2639 on 8630  Progress: 2640 on 8630  Progress: 2641 on 8630  Progress: 2642 on 8630  Progress: 2643 on 8630  Progress: 2644 on 8630  Progress: 2645 on 8630  Progress: 2646 on 8630  Progress: 2647 on 8630  Progress: 2648 on 8630  Progress: 2649 on 8630  Progress: 2650 on 8630  Progress: 2651 on 8630  Progress: 2652 on 8630  Progress: 2653 on 8630  Progress: 2654 on 8630  Progress: 2655 on 8630  Progress: 2656 on 8630  Progress: 2657 on 8630  Progress: 2658 on 8630  Progress: 2659 on 8630  Progress: 2660 on 8630  Progress: 2661 on 8630  Progress: 2662 on 8630  Progress: 2663 on 8630  Progress: 2664 on 8630  Progress: 2665 on 8630  Progress: 2666 on 8630  Progress: 2667 on 8630  Progress: 2668 on 8630  Progress: 2669 on 8630  Progress: 2670 on 8630  Progress: 2671 on 8630  Progress: 2672 on 8630  Progress: 2673 on 8630  Progress: 2674 on 8630  Progress: 2675 on 8630  Progress: 2676 on 8630  Progress: 2677 on 8630  Progress: 2678 on 8630  Progress: 2679 on 8630  Progress: 2680 on 8630  Progress: 2681 on 8630  Progress: 2682 on 8630  Progress: 2683 on 8630  Progress: 2684 on 8630  Progress: 2685 on 8630  Progress: 2686 on 8630  Progress: 2687 on 8630  Progress: 2688 on 8630  Progress: 2689 on 8630  Progress: 2690 on 8630  Progress: 2691 on 8630  Progress: 2692 on 8630  Progress: 2693 on 8630  Progress: 2694 on 8630  Progress: 2695 on 8630  Progress: 2696 on 8630  Progress: 2697 on 8630  Progress: 2698 on 8630  Progress: 2699 on 8630  Progress: 2700 on 8630  Progress: 2701 on 8630  Progress: 2702 on 8630  Progress: 2703 on 8630  Progress: 2704 on 8630  Progress: 2705 on 8630  Progress: 2706 on 8630  Progress: 2707 on 8630  Progress: 2708 on 8630  Progress: 2709 on 8630  Progress: 2710 on 8630  Progress: 2711 on 8630  Progress: 2712 on 8630  Progress: 2713 on 8630  Progress: 2714 on 8630  Progress: 2715 on 8630  Progress: 2716 on 8630  Progress: 2717 on 8630  Progress: 2718 on 8630  Progress: 2719 on 8630  Progress: 2720 on 8630  Progress: 2721 on 8630  Progress: 2722 on 8630  Progress: 2723 on 8630  Progress: 2724 on 8630  Progress: 2725 on 8630  Progress: 2726 on 8630  Progress: 2727 on 8630  Progress: 2728 on 8630  Progress: 2729 on 8630  Progress: 2730 on 8630  Progress: 2731 on 8630  Progress: 2732 on 8630  Progress: 2733 on 8630  Progress: 2734 on 8630  Progress: 2735 on 8630  Progress: 2736 on 8630  Progress: 2737 on 8630  Progress: 2738 on 8630  Progress: 2739 on 8630  Progress: 2740 on 8630  Progress: 2741 on 8630  Progress: 2742 on 8630  Progress: 2743 on 8630  Progress: 2744 on 8630  Progress: 2745 on 8630  Progress: 2746 on 8630  Progress: 2747 on 8630  Progress: 2748 on 8630  Progress: 2749 on 8630  Progress: 2750 on 8630  Progress: 2751 on 8630  Progress: 2752 on 8630  Progress: 2753 on 8630  Progress: 2754 on 8630  Progress: 2755 on 8630  Progress: 2756 on 8630  Progress: 2757 on 8630  Progress: 2758 on 8630  Progress: 2759 on 8630  Progress: 2760 on 8630  Progress: 2761 on 8630  Progress: 2762 on 8630  Progress: 2763 on 8630  Progress: 2764 on 8630  Progress: 2765 on 8630  Progress: 2766 on 8630  Progress: 2767 on 8630  Progress: 2768 on 8630  Progress: 2769 on 8630  Progress: 2770 on 8630  Progress: 2771 on 8630  Progress: 2772 on 8630  Progress: 2773 on 8630  Progress: 2774 on 8630  Progress: 2775 on 8630  Progress: 2776 on 8630  Progress: 2777 on 8630  Progress: 2778 on 8630  Progress: 2779 on 8630  Progress: 2780 on 8630  Progress: 2781 on 8630  Progress: 2782 on 8630  Progress: 2783 on 8630  Progress: 2784 on 8630  Progress: 2785 on 8630  Progress: 2786 on 8630  Progress: 2787 on 8630  Progress: 2788 on 8630  Progress: 2789 on 8630  Progress: 2790 on 8630  Progress: 2791 on 8630  Progress: 2792 on 8630  Progress: 2793 on 8630  Progress: 2794 on 8630  Progress: 2795 on 8630  Progress: 2796 on 8630  Progress: 2797 on 8630  Progress: 2798 on 8630  Progress: 2799 on 8630  Progress: 2800 on 8630  Progress: 2801 on 8630  Progress: 2802 on 8630  Progress: 2803 on 8630  Progress: 2804 on 8630  Progress: 2805 on 8630  Progress: 2806 on 8630  Progress: 2807 on 8630  Progress: 2808 on 8630  Progress: 2809 on 8630  Progress: 2810 on 8630  Progress: 2811 on 8630  Progress: 2812 on 8630  Progress: 2813 on 8630  Progress: 2814 on 8630  Progress: 2815 on 8630  Progress: 2816 on 8630  Progress: 2817 on 8630  Progress: 2818 on 8630  Progress: 2819 on 8630  Progress: 2820 on 8630  Progress: 2821 on 8630  Progress: 2822 on 8630  Progress: 2823 on 8630  Progress: 2824 on 8630  Progress: 2825 on 8630  Progress: 2826 on 8630  Progress: 2827 on 8630  Progress: 2828 on 8630  Progress: 2829 on 8630  Progress: 2830 on 8630  Progress: 2831 on 8630  Progress: 2832 on 8630  Progress: 2833 on 8630  Progress: 2834 on 8630  Progress: 2835 on 8630  Progress: 2836 on 8630  Progress: 2837 on 8630  Progress: 2838 on 8630  Progress: 2839 on 8630  Progress: 2840 on 8630  Progress: 2841 on 8630  Progress: 2842 on 8630  Progress: 2843 on 8630  Progress: 2844 on 8630  Progress: 2845 on 8630  Progress: 2846 on 8630  Progress: 2847 on 8630  Progress: 2848 on 8630  Progress: 2849 on 8630  Progress: 2850 on 8630  Progress: 2851 on 8630  Progress: 2852 on 8630  Progress: 2853 on 8630  Progress: 2854 on 8630  Progress: 2855 on 8630  Progress: 2856 on 8630  Progress: 2857 on 8630  Progress: 2858 on 8630  Progress: 2859 on 8630  Progress: 2860 on 8630  Progress: 2861 on 8630  Progress: 2862 on 8630  Progress: 2863 on 8630  Progress: 2864 on 8630  Progress: 2865 on 8630  Progress: 2866 on 8630  Progress: 2867 on 8630  Progress: 2868 on 8630  Progress: 2869 on 8630  Progress: 2870 on 8630  Progress: 2871 on 8630  Progress: 2872 on 8630  Progress: 2873 on 8630  Progress: 2874 on 8630  Progress: 2875 on 8630  Progress: 2876 on 8630  Progress: 2877 on 8630  Progress: 2878 on 8630  Progress: 2879 on 8630  Progress: 2880 on 8630  Progress: 2881 on 8630  Progress: 2882 on 8630  Progress: 2883 on 8630  Progress: 2884 on 8630  Progress: 2885 on 8630  Progress: 2886 on 8630  Progress: 2887 on 8630  Progress: 2888 on 8630  Progress: 2889 on 8630  Progress: 2890 on 8630  Progress: 2891 on 8630  Progress: 2892 on 8630  Progress: 2893 on 8630  Progress: 2894 on 8630  Progress: 2895 on 8630  Progress: 2896 on 8630  Progress: 2897 on 8630  Progress: 2898 on 8630  Progress: 2899 on 8630  Progress: 2900 on 8630  Progress: 2901 on 8630  Progress: 2902 on 8630  Progress: 2903 on 8630  Progress: 2904 on 8630  Progress: 2905 on 8630  Progress: 2906 on 8630  Progress: 2907 on 8630  Progress: 2908 on 8630  Progress: 2909 on 8630  Progress: 2910 on 8630  Progress: 2911 on 8630  Progress: 2912 on 8630  Progress: 2913 on 8630  Progress: 2914 on 8630  Progress: 2915 on 8630  Progress: 2916 on 8630  Progress: 2917 on 8630  Progress: 2918 on 8630  Progress: 2919 on 8630  Progress: 2920 on 8630  Progress: 2921 on 8630  Progress: 2922 on 8630  Progress: 2923 on 8630  Progress: 2924 on 8630  Progress: 2925 on 8630  Progress: 2926 on 8630  Progress: 2927 on 8630  Progress: 2928 on 8630  Progress: 2929 on 8630  Progress: 2930 on 8630  Progress: 2931 on 8630  Progress: 2932 on 8630  Progress: 2933 on 8630  Progress: 2934 on 8630  Progress: 2935 on 8630  Progress: 2936 on 8630  Progress: 2937 on 8630  Progress: 2938 on 8630  Progress: 2939 on 8630  Progress: 2940 on 8630  Progress: 2941 on 8630  Progress: 2942 on 8630  Progress: 2943 on 8630  Progress: 2944 on 8630  Progress: 2945 on 8630  Progress: 2946 on 8630  Progress: 2947 on 8630  Progress: 2948 on 8630  Progress: 2949 on 8630  Progress: 2950 on 8630  Progress: 2951 on 8630  Progress: 2952 on 8630  Progress: 2953 on 8630  Progress: 2954 on 8630  Progress: 2955 on 8630  Progress: 2956 on 8630  Progress: 2957 on 8630  Progress: 2958 on 8630  Progress: 2959 on 8630  Progress: 2960 on 8630  Progress: 2961 on 8630  Progress: 2962 on 8630  Progress: 2963 on 8630  Progress: 2964 on 8630  Progress: 2965 on 8630  Progress: 2966 on 8630  Progress: 2967 on 8630  Progress: 2968 on 8630  Progress: 2969 on 8630  Progress: 2970 on 8630  Progress: 2971 on 8630  Progress: 2972 on 8630  Progress: 2973 on 8630  Progress: 2974 on 8630  Progress: 2975 on 8630  Progress: 2976 on 8630  Progress: 2977 on 8630  Progress: 2978 on 8630  Progress: 2979 on 8630  Progress: 2980 on 8630  Progress: 2981 on 8630  Progress: 2982 on 8630  Progress: 2983 on 8630  Progress: 2984 on 8630  Progress: 2985 on 8630  Progress: 2986 on 8630  Progress: 2987 on 8630  Progress: 2988 on 8630  Progress: 2989 on 8630  Progress: 2990 on 8630  Progress: 2991 on 8630  Progress: 2992 on 8630  Progress: 2993 on 8630  Progress: 2994 on 8630  Progress: 2995 on 8630  Progress: 2996 on 8630  Progress: 2997 on 8630  Progress: 2998 on 8630  Progress: 2999 on 8630  Progress: 3000 on 8630  Progress: 3001 on 8630  Progress: 3002 on 8630  Progress: 3003 on 8630  Progress: 3004 on 8630  Progress: 3005 on 8630  Progress: 3006 on 8630  Progress: 3007 on 8630  Progress: 3008 on 8630  Progress: 3009 on 8630  Progress: 3010 on 8630  Progress: 3011 on 8630  Progress: 3012 on 8630  Progress: 3013 on 8630  Progress: 3014 on 8630  Progress: 3015 on 8630  Progress: 3016 on 8630  Progress: 3017 on 8630  Progress: 3018 on 8630  Progress: 3019 on 8630  Progress: 3020 on 8630  Progress: 3021 on 8630  Progress: 3022 on 8630  Progress: 3023 on 8630  Progress: 3024 on 8630  Progress: 3025 on 8630  Progress: 3026 on 8630  Progress: 3027 on 8630  Progress: 3028 on 8630  Progress: 3029 on 8630  Progress: 3030 on 8630  Progress: 3031 on 8630  Progress: 3032 on 8630  Progress: 3033 on 8630  Progress: 3034 on 8630  Progress: 3035 on 8630  Progress: 3036 on 8630  Progress: 3037 on 8630  Progress: 3038 on 8630  Progress: 3039 on 8630  Progress: 3040 on 8630  Progress: 3041 on 8630  Progress: 3042 on 8630  Progress: 3043 on 8630  Progress: 3044 on 8630  Progress: 3045 on 8630  Progress: 3046 on 8630  Progress: 3047 on 8630  Progress: 3048 on 8630  Progress: 3049 on 8630  Progress: 3050 on 8630  Progress: 3051 on 8630  Progress: 3052 on 8630  Progress: 3053 on 8630  Progress: 3054 on 8630  Progress: 3055 on 8630  Progress: 3056 on 8630  Progress: 3057 on 8630  Progress: 3058 on 8630  Progress: 3059 on 8630  Progress: 3060 on 8630  Progress: 3061 on 8630  Progress: 3062 on 8630  Progress: 3063 on 8630  Progress: 3064 on 8630  Progress: 3065 on 8630  Progress: 3066 on 8630  Progress: 3067 on 8630  Progress: 3068 on 8630  Progress: 3069 on 8630  Progress: 3070 on 8630  Progress: 3071 on 8630  Progress: 3072 on 8630  Progress: 3073 on 8630  Progress: 3074 on 8630  Progress: 3075 on 8630  Progress: 3076 on 8630  Progress: 3077 on 8630  Progress: 3078 on 8630  Progress: 3079 on 8630  Progress: 3080 on 8630  Progress: 3081 on 8630  Progress: 3082 on 8630  Progress: 3083 on 8630  Progress: 3084 on 8630  Progress: 3085 on 8630  Progress: 3086 on 8630  Progress: 3087 on 8630  Progress: 3088 on 8630  Progress: 3089 on 8630  Progress: 3090 on 8630  Progress: 3091 on 8630  Progress: 3092 on 8630  Progress: 3093 on 8630  Progress: 3094 on 8630  Progress: 3095 on 8630  Progress: 3096 on 8630  Progress: 3097 on 8630  Progress: 3098 on 8630  Progress: 3099 on 8630  Progress: 3100 on 8630  Progress: 3101 on 8630  Progress: 3102 on 8630  Progress: 3103 on 8630  Progress: 3104 on 8630  Progress: 3105 on 8630  Progress: 3106 on 8630  Progress: 3107 on 8630  Progress: 3108 on 8630  Progress: 3109 on 8630  Progress: 3110 on 8630  Progress: 3111 on 8630  Progress: 3112 on 8630  Progress: 3113 on 8630  Progress: 3114 on 8630  Progress: 3115 on 8630  Progress: 3116 on 8630  Progress: 3117 on 8630  Progress: 3118 on 8630  Progress: 3119 on 8630  Progress: 3120 on 8630  Progress: 3121 on 8630  Progress: 3122 on 8630  Progress: 3123 on 8630  Progress: 3124 on 8630  Progress: 3125 on 8630  Progress: 3126 on 8630  Progress: 3127 on 8630  Progress: 3128 on 8630  Progress: 3129 on 8630  Progress: 3130 on 8630  Progress: 3131 on 8630  Progress: 3132 on 8630  Progress: 3133 on 8630  Progress: 3134 on 8630  Progress: 3135 on 8630  Progress: 3136 on 8630  Progress: 3137 on 8630  Progress: 3138 on 8630  Progress: 3139 on 8630  Progress: 3140 on 8630  Progress: 3141 on 8630  Progress: 3142 on 8630  Progress: 3143 on 8630  Progress: 3144 on 8630  Progress: 3145 on 8630  Progress: 3146 on 8630  Progress: 3147 on 8630  Progress: 3148 on 8630  Progress: 3149 on 8630  Progress: 3150 on 8630  Progress: 3151 on 8630  Progress: 3152 on 8630  Progress: 3153 on 8630  Progress: 3154 on 8630  Progress: 3155 on 8630  Progress: 3156 on 8630  Progress: 3157 on 8630  Progress: 3158 on 8630  Progress: 3159 on 8630  Progress: 3160 on 8630  Progress: 3161 on 8630  Progress: 3162 on 8630  Progress: 3163 on 8630  Progress: 3164 on 8630  Progress: 3165 on 8630  Progress: 3166 on 8630  Progress: 3167 on 8630  Progress: 3168 on 8630  Progress: 3169 on 8630  Progress: 3170 on 8630  Progress: 3171 on 8630  Progress: 3172 on 8630  Progress: 3173 on 8630  Progress: 3174 on 8630  Progress: 3175 on 8630  Progress: 3176 on 8630  Progress: 3177 on 8630  Progress: 3178 on 8630  Progress: 3179 on 8630  Progress: 3180 on 8630  Progress: 3181 on 8630  Progress: 3182 on 8630  Progress: 3183 on 8630  Progress: 3184 on 8630  Progress: 3185 on 8630  Progress: 3186 on 8630  Progress: 3187 on 8630  Progress: 3188 on 8630  Progress: 3189 on 8630  Progress: 3190 on 8630  Progress: 3191 on 8630  Progress: 3192 on 8630  Progress: 3193 on 8630  Progress: 3194 on 8630  Progress: 3195 on 8630  Progress: 3196 on 8630  Progress: 3197 on 8630  Progress: 3198 on 8630  Progress: 3199 on 8630  Progress: 3200 on 8630  Progress: 3201 on 8630  Progress: 3202 on 8630  Progress: 3203 on 8630  Progress: 3204 on 8630  Progress: 3205 on 8630  Progress: 3206 on 8630  Progress: 3207 on 8630  Progress: 3208 on 8630  Progress: 3209 on 8630  Progress: 3210 on 8630  Progress: 3211 on 8630  Progress: 3212 on 8630  Progress: 3213 on 8630  Progress: 3214 on 8630  Progress: 3215 on 8630  Progress: 3216 on 8630  Progress: 3217 on 8630  Progress: 3218 on 8630  Progress: 3219 on 8630  Progress: 3220 on 8630  Progress: 3221 on 8630  Progress: 3222 on 8630  Progress: 3223 on 8630  Progress: 3224 on 8630  Progress: 3225 on 8630  Progress: 3226 on 8630  Progress: 3227 on 8630  Progress: 3228 on 8630  Progress: 3229 on 8630  Progress: 3230 on 8630  Progress: 3231 on 8630  Progress: 3232 on 8630  Progress: 3233 on 8630  Progress: 3234 on 8630  Progress: 3235 on 8630  Progress: 3236 on 8630  Progress: 3237 on 8630  Progress: 3238 on 8630  Progress: 3239 on 8630  Progress: 3240 on 8630  Progress: 3241 on 8630  Progress: 3242 on 8630  Progress: 3243 on 8630  Progress: 3244 on 8630  Progress: 3245 on 8630  Progress: 3246 on 8630  Progress: 3247 on 8630  Progress: 3248 on 8630  Progress: 3249 on 8630  Progress: 3250 on 8630  Progress: 3251 on 8630  Progress: 3252 on 8630  Progress: 3253 on 8630  Progress: 3254 on 8630  Progress: 3255 on 8630  Progress: 3256 on 8630  Progress: 3257 on 8630  Progress: 3258 on 8630  Progress: 3259 on 8630  Progress: 3260 on 8630  Progress: 3261 on 8630  Progress: 3262 on 8630  Progress: 3263 on 8630  Progress: 3264 on 8630  Progress: 3265 on 8630  Progress: 3266 on 8630  Progress: 3267 on 8630  Progress: 3268 on 8630  Progress: 3269 on 8630  Progress: 3270 on 8630  Progress: 3271 on 8630  Progress: 3272 on 8630  Progress: 3273 on 8630  Progress: 3274 on 8630  Progress: 3275 on 8630  Progress: 3276 on 8630  Progress: 3277 on 8630  Progress: 3278 on 8630  Progress: 3279 on 8630  Progress: 3280 on 8630  Progress: 3281 on 8630  Progress: 3282 on 8630  Progress: 3283 on 8630  Progress: 3284 on 8630  Progress: 3285 on 8630  Progress: 3286 on 8630  Progress: 3287 on 8630  Progress: 3288 on 8630  Progress: 3289 on 8630  Progress: 3290 on 8630  Progress: 3291 on 8630  Progress: 3292 on 8630  Progress: 3293 on 8630  Progress: 3294 on 8630  Progress: 3295 on 8630  Progress: 3296 on 8630  Progress: 3297 on 8630  Progress: 3298 on 8630  Progress: 3299 on 8630  Progress: 3300 on 8630  Progress: 3301 on 8630  Progress: 3302 on 8630  Progress: 3303 on 8630  Progress: 3304 on 8630  Progress: 3305 on 8630  Progress: 3306 on 8630  Progress: 3307 on 8630  Progress: 3308 on 8630  Progress: 3309 on 8630  Progress: 3310 on 8630  Progress: 3311 on 8630  Progress: 3312 on 8630  Progress: 3313 on 8630  Progress: 3314 on 8630  Progress: 3315 on 8630  Progress: 3316 on 8630  Progress: 3317 on 8630  Progress: 3318 on 8630  Progress: 3319 on 8630  Progress: 3320 on 8630  Progress: 3321 on 8630  Progress: 3322 on 8630  Progress: 3323 on 8630  Progress: 3324 on 8630  Progress: 3325 on 8630  Progress: 3326 on 8630  Progress: 3327 on 8630  Progress: 3328 on 8630  Progress: 3329 on 8630  Progress: 3330 on 8630  Progress: 3331 on 8630  Progress: 3332 on 8630  Progress: 3333 on 8630  Progress: 3334 on 8630  Progress: 3335 on 8630  Progress: 3336 on 8630  Progress: 3337 on 8630  Progress: 3338 on 8630  Progress: 3339 on 8630  Progress: 3340 on 8630  Progress: 3341 on 8630  Progress: 3342 on 8630  Progress: 3343 on 8630  Progress: 3344 on 8630  Progress: 3345 on 8630  Progress: 3346 on 8630  Progress: 3347 on 8630  Progress: 3348 on 8630  Progress: 3349 on 8630  Progress: 3350 on 8630  Progress: 3351 on 8630  Progress: 3352 on 8630  Progress: 3353 on 8630  Progress: 3354 on 8630  Progress: 3355 on 8630  Progress: 3356 on 8630  Progress: 3357 on 8630  Progress: 3358 on 8630  Progress: 3359 on 8630  Progress: 3360 on 8630  Progress: 3361 on 8630  Progress: 3362 on 8630  Progress: 3363 on 8630  Progress: 3364 on 8630  Progress: 3365 on 8630  Progress: 3366 on 8630  Progress: 3367 on 8630  Progress: 3368 on 8630  Progress: 3369 on 8630  Progress: 3370 on 8630  Progress: 3371 on 8630  Progress: 3372 on 8630  Progress: 3373 on 8630  Progress: 3374 on 8630  Progress: 3375 on 8630  Progress: 3376 on 8630  Progress: 3377 on 8630  Progress: 3378 on 8630  Progress: 3379 on 8630  Progress: 3380 on 8630  Progress: 3381 on 8630  Progress: 3382 on 8630  Progress: 3383 on 8630  Progress: 3384 on 8630  Progress: 3385 on 8630  Progress: 3386 on 8630  Progress: 3387 on 8630  Progress: 3388 on 8630  Progress: 3389 on 8630  Progress: 3390 on 8630  Progress: 3391 on 8630  Progress: 3392 on 8630  Progress: 3393 on 8630  Progress: 3394 on 8630  Progress: 3395 on 8630  Progress: 3396 on 8630  Progress: 3397 on 8630  Progress: 3398 on 8630  Progress: 3399 on 8630  Progress: 3400 on 8630  Progress: 3401 on 8630  Progress: 3402 on 8630  Progress: 3403 on 8630  Progress: 3404 on 8630  Progress: 3405 on 8630  Progress: 3406 on 8630  Progress: 3407 on 8630  Progress: 3408 on 8630  Progress: 3409 on 8630  Progress: 3410 on 8630  Progress: 3411 on 8630  Progress: 3412 on 8630  Progress: 3413 on 8630  Progress: 3414 on 8630  Progress: 3415 on 8630  Progress: 3416 on 8630  Progress: 3417 on 8630  Progress: 3418 on 8630  Progress: 3419 on 8630  Progress: 3420 on 8630  Progress: 3421 on 8630  Progress: 3422 on 8630  Progress: 3423 on 8630  Progress: 3424 on 8630  Progress: 3425 on 8630  Progress: 3426 on 8630  Progress: 3427 on 8630  Progress: 3428 on 8630  Progress: 3429 on 8630  Progress: 3430 on 8630  Progress: 3431 on 8630  Progress: 3432 on 8630  Progress: 3433 on 8630  Progress: 3434 on 8630  Progress: 3435 on 8630  Progress: 3436 on 8630  Progress: 3437 on 8630  Progress: 3438 on 8630  Progress: 3439 on 8630  Progress: 3440 on 8630  Progress: 3441 on 8630  Progress: 3442 on 8630  Progress: 3443 on 8630  Progress: 3444 on 8630  Progress: 3445 on 8630  Progress: 3446 on 8630  Progress: 3447 on 8630  Progress: 3448 on 8630  Progress: 3449 on 8630  Progress: 3450 on 8630  Progress: 3451 on 8630  Progress: 3452 on 8630  Progress: 3453 on 8630  Progress: 3454 on 8630  Progress: 3455 on 8630  Progress: 3456 on 8630  Progress: 3457 on 8630  Progress: 3458 on 8630  Progress: 3459 on 8630  Progress: 3460 on 8630  Progress: 3461 on 8630  Progress: 3462 on 8630  Progress: 3463 on 8630  Progress: 3464 on 8630  Progress: 3465 on 8630  Progress: 3466 on 8630  Progress: 3467 on 8630  Progress: 3468 on 8630  Progress: 3469 on 8630  Progress: 3470 on 8630  Progress: 3471 on 8630  Progress: 3472 on 8630  Progress: 3473 on 8630  Progress: 3474 on 8630  Progress: 3475 on 8630  Progress: 3476 on 8630  Progress: 3477 on 8630  Progress: 3478 on 8630  Progress: 3479 on 8630  Progress: 3480 on 8630  Progress: 3481 on 8630  Progress: 3482 on 8630  Progress: 3483 on 8630  Progress: 3484 on 8630  Progress: 3485 on 8630  Progress: 3486 on 8630  Progress: 3487 on 8630  Progress: 3488 on 8630  Progress: 3489 on 8630  Progress: 3490 on 8630  Progress: 3491 on 8630  Progress: 3492 on 8630  Progress: 3493 on 8630  Progress: 3494 on 8630  Progress: 3495 on 8630  Progress: 3496 on 8630  Progress: 3497 on 8630  Progress: 3498 on 8630  Progress: 3499 on 8630  Progress: 3500 on 8630  Progress: 3501 on 8630  Progress: 3502 on 8630  Progress: 3503 on 8630  Progress: 3504 on 8630  Progress: 3505 on 8630  Progress: 3506 on 8630  Progress: 3507 on 8630  Progress: 3508 on 8630  Progress: 3509 on 8630  Progress: 3510 on 8630  Progress: 3511 on 8630  Progress: 3512 on 8630  Progress: 3513 on 8630  Progress: 3514 on 8630  Progress: 3515 on 8630  Progress: 3516 on 8630  Progress: 3517 on 8630  Progress: 3518 on 8630  Progress: 3519 on 8630  Progress: 3520 on 8630  Progress: 3521 on 8630  Progress: 3522 on 8630  Progress: 3523 on 8630  Progress: 3524 on 8630  Progress: 3525 on 8630  Progress: 3526 on 8630  Progress: 3527 on 8630  Progress: 3528 on 8630  Progress: 3529 on 8630  Progress: 3530 on 8630  Progress: 3531 on 8630  Progress: 3532 on 8630  Progress: 3533 on 8630  Progress: 3534 on 8630  Progress: 3535 on 8630  Progress: 3536 on 8630  Progress: 3537 on 8630  Progress: 3538 on 8630  Progress: 3539 on 8630  Progress: 3540 on 8630  Progress: 3541 on 8630  Progress: 3542 on 8630  Progress: 3543 on 8630  Progress: 3544 on 8630  Progress: 3545 on 8630  Progress: 3546 on 8630  Progress: 3547 on 8630  Progress: 3548 on 8630  Progress: 3549 on 8630  Progress: 3550 on 8630  Progress: 3551 on 8630  Progress: 3552 on 8630  Progress: 3553 on 8630  Progress: 3554 on 8630  Progress: 3555 on 8630  Progress: 3556 on 8630  Progress: 3557 on 8630  Progress: 3558 on 8630  Progress: 3559 on 8630  Progress: 3560 on 8630  Progress: 3561 on 8630  Progress: 3562 on 8630  Progress: 3563 on 8630  Progress: 3564 on 8630  Progress: 3565 on 8630  Progress: 3566 on 8630  Progress: 3567 on 8630  Progress: 3568 on 8630  Progress: 3569 on 8630  Progress: 3570 on 8630  Progress: 3571 on 8630  Progress: 3572 on 8630  Progress: 3573 on 8630  Progress: 3574 on 8630  Progress: 3575 on 8630  Progress: 3576 on 8630  Progress: 3577 on 8630  Progress: 3578 on 8630  Progress: 3579 on 8630  Progress: 3580 on 8630  Progress: 3581 on 8630  Progress: 3582 on 8630  Progress: 3583 on 8630  Progress: 3584 on 8630  Progress: 3585 on 8630  Progress: 3586 on 8630  Progress: 3587 on 8630  Progress: 3588 on 8630  Progress: 3589 on 8630  Progress: 3590 on 8630  Progress: 3591 on 8630  Progress: 3592 on 8630  Progress: 3593 on 8630  Progress: 3594 on 8630  Progress: 3595 on 8630  Progress: 3596 on 8630  Progress: 3597 on 8630  Progress: 3598 on 8630  Progress: 3599 on 8630  Progress: 3600 on 8630  Progress: 3601 on 8630  Progress: 3602 on 8630  Progress: 3603 on 8630  Progress: 3604 on 8630  Progress: 3605 on 8630  Progress: 3606 on 8630  Progress: 3607 on 8630  Progress: 3608 on 8630  Progress: 3609 on 8630  Progress: 3610 on 8630  Progress: 3611 on 8630  Progress: 3612 on 8630  Progress: 3613 on 8630  Progress: 3614 on 8630  Progress: 3615 on 8630  Progress: 3616 on 8630  Progress: 3617 on 8630  Progress: 3618 on 8630  Progress: 3619 on 8630  Progress: 3620 on 8630  Progress: 3621 on 8630  Progress: 3622 on 8630  Progress: 3623 on 8630  Progress: 3624 on 8630  Progress: 3625 on 8630  Progress: 3626 on 8630  Progress: 3627 on 8630  Progress: 3628 on 8630  Progress: 3629 on 8630  Progress: 3630 on 8630  Progress: 3631 on 8630  Progress: 3632 on 8630  Progress: 3633 on 8630  Progress: 3634 on 8630  Progress: 3635 on 8630  Progress: 3636 on 8630  Progress: 3637 on 8630  Progress: 3638 on 8630  Progress: 3639 on 8630  Progress: 3640 on 8630  Progress: 3641 on 8630  Progress: 3642 on 8630  Progress: 3643 on 8630  Progress: 3644 on 8630  Progress: 3645 on 8630  Progress: 3646 on 8630  Progress: 3647 on 8630  Progress: 3648 on 8630  Progress: 3649 on 8630  Progress: 3650 on 8630  Progress: 3651 on 8630  Progress: 3652 on 8630  Progress: 3653 on 8630  Progress: 3654 on 8630  Progress: 3655 on 8630  Progress: 3656 on 8630  Progress: 3657 on 8630  Progress: 3658 on 8630  Progress: 3659 on 8630  Progress: 3660 on 8630  Progress: 3661 on 8630  Progress: 3662 on 8630  Progress: 3663 on 8630  Progress: 3664 on 8630  Progress: 3665 on 8630  Progress: 3666 on 8630  Progress: 3667 on 8630  Progress: 3668 on 8630  Progress: 3669 on 8630  Progress: 3670 on 8630  Progress: 3671 on 8630  Progress: 3672 on 8630  Progress: 3673 on 8630  Progress: 3674 on 8630  Progress: 3675 on 8630  Progress: 3676 on 8630  Progress: 3677 on 8630  Progress: 3678 on 8630  Progress: 3679 on 8630  Progress: 3680 on 8630  Progress: 3681 on 8630  Progress: 3682 on 8630  Progress: 3683 on 8630  Progress: 3684 on 8630  Progress: 3685 on 8630  Progress: 3686 on 8630  Progress: 3687 on 8630  Progress: 3688 on 8630  Progress: 3689 on 8630  Progress: 3690 on 8630  Progress: 3691 on 8630  Progress: 3692 on 8630  Progress: 3693 on 8630  Progress: 3694 on 8630  Progress: 3695 on 8630  Progress: 3696 on 8630  Progress: 3697 on 8630  Progress: 3698 on 8630  Progress: 3699 on 8630  Progress: 3700 on 8630  Progress: 3701 on 8630  Progress: 3702 on 8630  Progress: 3703 on 8630  Progress: 3704 on 8630  Progress: 3705 on 8630  Progress: 3706 on 8630  Progress: 3707 on 8630  Progress: 3708 on 8630  Progress: 3709 on 8630  Progress: 3710 on 8630  Progress: 3711 on 8630  Progress: 3712 on 8630  Progress: 3713 on 8630  Progress: 3714 on 8630  Progress: 3715 on 8630  Progress: 3716 on 8630  Progress: 3717 on 8630  Progress: 3718 on 8630  Progress: 3719 on 8630  Progress: 3720 on 8630  Progress: 3721 on 8630  Progress: 3722 on 8630  Progress: 3723 on 8630  Progress: 3724 on 8630  Progress: 3725 on 8630  Progress: 3726 on 8630  Progress: 3727 on 8630  Progress: 3728 on 8630  Progress: 3729 on 8630  Progress: 3730 on 8630  Progress: 3731 on 8630  Progress: 3732 on 8630  Progress: 3733 on 8630  Progress: 3734 on 8630  Progress: 3735 on 8630  Progress: 3736 on 8630  Progress: 3737 on 8630  Progress: 3738 on 8630  Progress: 3739 on 8630  Progress: 3740 on 8630  Progress: 3741 on 8630  Progress: 3742 on 8630  Progress: 3743 on 8630  Progress: 3744 on 8630  Progress: 3745 on 8630  Progress: 3746 on 8630  Progress: 3747 on 8630  Progress: 3748 on 8630  Progress: 3749 on 8630  Progress: 3750 on 8630  Progress: 3751 on 8630  Progress: 3752 on 8630  Progress: 3753 on 8630  Progress: 3754 on 8630  Progress: 3755 on 8630  Progress: 3756 on 8630  Progress: 3757 on 8630  Progress: 3758 on 8630  Progress: 3759 on 8630  Progress: 3760 on 8630  Progress: 3761 on 8630  Progress: 3762 on 8630  Progress: 3763 on 8630  Progress: 3764 on 8630  Progress: 3765 on 8630  Progress: 3766 on 8630  Progress: 3767 on 8630  Progress: 3768 on 8630  Progress: 3769 on 8630  Progress: 3770 on 8630  Progress: 3771 on 8630  Progress: 3772 on 8630  Progress: 3773 on 8630  Progress: 3774 on 8630  Progress: 3775 on 8630  Progress: 3776 on 8630  Progress: 3777 on 8630  Progress: 3778 on 8630  Progress: 3779 on 8630  Progress: 3780 on 8630  Progress: 3781 on 8630  Progress: 3782 on 8630  Progress: 3783 on 8630  Progress: 3784 on 8630  Progress: 3785 on 8630  Progress: 3786 on 8630  Progress: 3787 on 8630  Progress: 3788 on 8630  Progress: 3789 on 8630  Progress: 3790 on 8630  Progress: 3791 on 8630  Progress: 3792 on 8630  Progress: 3793 on 8630  Progress: 3794 on 8630  Progress: 3795 on 8630  Progress: 3796 on 8630  Progress: 3797 on 8630  Progress: 3798 on 8630  Progress: 3799 on 8630  Progress: 3800 on 8630  Progress: 3801 on 8630  Progress: 3802 on 8630  Progress: 3803 on 8630  Progress: 3804 on 8630  Progress: 3805 on 8630  Progress: 3806 on 8630  Progress: 3807 on 8630  Progress: 3808 on 8630  Progress: 3809 on 8630  Progress: 3810 on 8630  Progress: 3811 on 8630  Progress: 3812 on 8630  Progress: 3813 on 8630  Progress: 3814 on 8630  Progress: 3815 on 8630  Progress: 3816 on 8630  Progress: 3817 on 8630  Progress: 3818 on 8630  Progress: 3819 on 8630  Progress: 3820 on 8630  Progress: 3821 on 8630  Progress: 3822 on 8630  Progress: 3823 on 8630  Progress: 3824 on 8630  Progress: 3825 on 8630  Progress: 3826 on 8630  Progress: 3827 on 8630  Progress: 3828 on 8630  Progress: 3829 on 8630  Progress: 3830 on 8630  Progress: 3831 on 8630  Progress: 3832 on 8630  Progress: 3833 on 8630  Progress: 3834 on 8630  Progress: 3835 on 8630  Progress: 3836 on 8630  Progress: 3837 on 8630  Progress: 3838 on 8630  Progress: 3839 on 8630  Progress: 3840 on 8630  Progress: 3841 on 8630  Progress: 3842 on 8630  Progress: 3843 on 8630  Progress: 3844 on 8630  Progress: 3845 on 8630  Progress: 3846 on 8630  Progress: 3847 on 8630  Progress: 3848 on 8630  Progress: 3849 on 8630  Progress: 3850 on 8630  Progress: 3851 on 8630  Progress: 3852 on 8630  Progress: 3853 on 8630  Progress: 3854 on 8630  Progress: 3855 on 8630  Progress: 3856 on 8630  Progress: 3857 on 8630  Progress: 3858 on 8630  Progress: 3859 on 8630  Progress: 3860 on 8630  Progress: 3861 on 8630  Progress: 3862 on 8630  Progress: 3863 on 8630  Progress: 3864 on 8630  Progress: 3865 on 8630  Progress: 3866 on 8630  Progress: 3867 on 8630  Progress: 3868 on 8630  Progress: 3869 on 8630  Progress: 3870 on 8630  Progress: 3871 on 8630  Progress: 3872 on 8630  Progress: 3873 on 8630  Progress: 3874 on 8630  Progress: 3875 on 8630  Progress: 3876 on 8630  Progress: 3877 on 8630  Progress: 3878 on 8630  Progress: 3879 on 8630  Progress: 3880 on 8630  Progress: 3881 on 8630  Progress: 3882 on 8630  Progress: 3883 on 8630  Progress: 3884 on 8630  Progress: 3885 on 8630  Progress: 3886 on 8630  Progress: 3887 on 8630  Progress: 3888 on 8630  Progress: 3889 on 8630  Progress: 3890 on 8630  Progress: 3891 on 8630  Progress: 3892 on 8630  Progress: 3893 on 8630  Progress: 3894 on 8630  Progress: 3895 on 8630  Progress: 3896 on 8630  Progress: 3897 on 8630  Progress: 3898 on 8630  Progress: 3899 on 8630  Progress: 3900 on 8630  Progress: 3901 on 8630  Progress: 3902 on 8630  Progress: 3903 on 8630  Progress: 3904 on 8630  Progress: 3905 on 8630  Progress: 3906 on 8630  Progress: 3907 on 8630  Progress: 3908 on 8630  Progress: 3909 on 8630  Progress: 3910 on 8630  Progress: 3911 on 8630  Progress: 3912 on 8630  Progress: 3913 on 8630  Progress: 3914 on 8630  Progress: 3915 on 8630  Progress: 3916 on 8630  Progress: 3917 on 8630  Progress: 3918 on 8630  Progress: 3919 on 8630  Progress: 3920 on 8630  Progress: 3921 on 8630  Progress: 3922 on 8630  Progress: 3923 on 8630  Progress: 3924 on 8630  Progress: 3925 on 8630  Progress: 3926 on 8630  Progress: 3927 on 8630  Progress: 3928 on 8630  Progress: 3929 on 8630  Progress: 3930 on 8630  Progress: 3931 on 8630  Progress: 3932 on 8630  Progress: 3933 on 8630  Progress: 3934 on 8630  Progress: 3935 on 8630  Progress: 3936 on 8630  Progress: 3937 on 8630  Progress: 3938 on 8630  Progress: 3939 on 8630  Progress: 3940 on 8630  Progress: 3941 on 8630  Progress: 3942 on 8630  Progress: 3943 on 8630  Progress: 3944 on 8630  Progress: 3945 on 8630  Progress: 3946 on 8630  Progress: 3947 on 8630  Progress: 3948 on 8630  Progress: 3949 on 8630  Progress: 3950 on 8630  Progress: 3951 on 8630  Progress: 3952 on 8630  Progress: 3953 on 8630  Progress: 3954 on 8630  Progress: 3955 on 8630  Progress: 3956 on 8630  Progress: 3957 on 8630  Progress: 3958 on 8630  Progress: 3959 on 8630  Progress: 3960 on 8630  Progress: 3961 on 8630  Progress: 3962 on 8630  Progress: 3963 on 8630  Progress: 3964 on 8630  Progress: 3965 on 8630  Progress: 3966 on 8630  Progress: 3967 on 8630  Progress: 3968 on 8630  Progress: 3969 on 8630  Progress: 3970 on 8630  Progress: 3971 on 8630  Progress: 3972 on 8630  Progress: 3973 on 8630  Progress: 3974 on 8630  Progress: 3975 on 8630  Progress: 3976 on 8630  Progress: 3977 on 8630  Progress: 3978 on 8630  Progress: 3979 on 8630  Progress: 3980 on 8630  Progress: 3981 on 8630  Progress: 3982 on 8630  Progress: 3983 on 8630  Progress: 3984 on 8630  Progress: 3985 on 8630  Progress: 3986 on 8630  Progress: 3987 on 8630  Progress: 3988 on 8630  Progress: 3989 on 8630  Progress: 3990 on 8630  Progress: 3991 on 8630  Progress: 3992 on 8630  Progress: 3993 on 8630  Progress: 3994 on 8630  Progress: 3995 on 8630  Progress: 3996 on 8630  Progress: 3997 on 8630  Progress: 3998 on 8630  Progress: 3999 on 8630  Progress: 4000 on 8630  Progress: 4001 on 8630  Progress: 4002 on 8630  Progress: 4003 on 8630  Progress: 4004 on 8630  Progress: 4005 on 8630  Progress: 4006 on 8630  Progress: 4007 on 8630  Progress: 4008 on 8630  Progress: 4009 on 8630  Progress: 4010 on 8630  Progress: 4011 on 8630  Progress: 4012 on 8630  Progress: 4013 on 8630  Progress: 4014 on 8630  Progress: 4015 on 8630  Progress: 4016 on 8630  Progress: 4017 on 8630  Progress: 4018 on 8630  Progress: 4019 on 8630  Progress: 4020 on 8630  Progress: 4021 on 8630  Progress: 4022 on 8630  Progress: 4023 on 8630  Progress: 4024 on 8630  Progress: 4025 on 8630  Progress: 4026 on 8630  Progress: 4027 on 8630  Progress: 4028 on 8630  Progress: 4029 on 8630  Progress: 4030 on 8630  Progress: 4031 on 8630  Progress: 4032 on 8630  Progress: 4033 on 8630  Progress: 4034 on 8630  Progress: 4035 on 8630  Progress: 4036 on 8630  Progress: 4037 on 8630  Progress: 4038 on 8630  Progress: 4039 on 8630  Progress: 4040 on 8630  Progress: 4041 on 8630  Progress: 4042 on 8630  Progress: 4043 on 8630  Progress: 4044 on 8630  Progress: 4045 on 8630  Progress: 4046 on 8630  Progress: 4047 on 8630  Progress: 4048 on 8630  Progress: 4049 on 8630  Progress: 4050 on 8630  Progress: 4051 on 8630  Progress: 4052 on 8630  Progress: 4053 on 8630  Progress: 4054 on 8630  Progress: 4055 on 8630  Progress: 4056 on 8630  Progress: 4057 on 8630  Progress: 4058 on 8630  Progress: 4059 on 8630  Progress: 4060 on 8630  Progress: 4061 on 8630  Progress: 4062 on 8630  Progress: 4063 on 8630  Progress: 4064 on 8630  Progress: 4065 on 8630  Progress: 4066 on 8630  Progress: 4067 on 8630  Progress: 4068 on 8630  Progress: 4069 on 8630  Progress: 4070 on 8630  Progress: 4071 on 8630  Progress: 4072 on 8630  Progress: 4073 on 8630  Progress: 4074 on 8630  Progress: 4075 on 8630  Progress: 4076 on 8630  Progress: 4077 on 8630  Progress: 4078 on 8630  Progress: 4079 on 8630  Progress: 4080 on 8630  Progress: 4081 on 8630  Progress: 4082 on 8630  Progress: 4083 on 8630  Progress: 4084 on 8630  Progress: 4085 on 8630  Progress: 4086 on 8630  Progress: 4087 on 8630  Progress: 4088 on 8630  Progress: 4089 on 8630  Progress: 4090 on 8630  Progress: 4091 on 8630  Progress: 4092 on 8630  Progress: 4093 on 8630  Progress: 4094 on 8630  Progress: 4095 on 8630  Progress: 4096 on 8630  Progress: 4097 on 8630  Progress: 4098 on 8630  Progress: 4099 on 8630  Progress: 4100 on 8630  Progress: 4101 on 8630  Progress: 4102 on 8630  Progress: 4103 on 8630  Progress: 4104 on 8630  Progress: 4105 on 8630  Progress: 4106 on 8630  Progress: 4107 on 8630  Progress: 4108 on 8630  Progress: 4109 on 8630  Progress: 4110 on 8630  Progress: 4111 on 8630  Progress: 4112 on 8630  Progress: 4113 on 8630  Progress: 4114 on 8630  Progress: 4115 on 8630  Progress: 4116 on 8630  Progress: 4117 on 8630  Progress: 4118 on 8630  Progress: 4119 on 8630  Progress: 4120 on 8630  Progress: 4121 on 8630  Progress: 4122 on 8630  Progress: 4123 on 8630  Progress: 4124 on 8630  Progress: 4125 on 8630  Progress: 4126 on 8630  Progress: 4127 on 8630  Progress: 4128 on 8630  Progress: 4129 on 8630  Progress: 4130 on 8630  Progress: 4131 on 8630  Progress: 4132 on 8630  Progress: 4133 on 8630  Progress: 4134 on 8630  Progress: 4135 on 8630  Progress: 4136 on 8630  Progress: 4137 on 8630  Progress: 4138 on 8630  Progress: 4139 on 8630  Progress: 4140 on 8630  Progress: 4141 on 8630  Progress: 4142 on 8630  Progress: 4143 on 8630  Progress: 4144 on 8630  Progress: 4145 on 8630  Progress: 4146 on 8630  Progress: 4147 on 8630  Progress: 4148 on 8630  Progress: 4149 on 8630  Progress: 4150 on 8630  Progress: 4151 on 8630  Progress: 4152 on 8630  Progress: 4153 on 8630  Progress: 4154 on 8630  Progress: 4155 on 8630  Progress: 4156 on 8630  Progress: 4157 on 8630  Progress: 4158 on 8630  Progress: 4159 on 8630  Progress: 4160 on 8630  Progress: 4161 on 8630  Progress: 4162 on 8630  Progress: 4163 on 8630  Progress: 4164 on 8630  Progress: 4165 on 8630  Progress: 4166 on 8630  Progress: 4167 on 8630  Progress: 4168 on 8630  Progress: 4169 on 8630  Progress: 4170 on 8630  Progress: 4171 on 8630  Progress: 4172 on 8630  Progress: 4173 on 8630  Progress: 4174 on 8630  Progress: 4175 on 8630  Progress: 4176 on 8630  Progress: 4177 on 8630  Progress: 4178 on 8630  Progress: 4179 on 8630  Progress: 4180 on 8630  Progress: 4181 on 8630  Progress: 4182 on 8630  Progress: 4183 on 8630  Progress: 4184 on 8630  Progress: 4185 on 8630  Progress: 4186 on 8630  Progress: 4187 on 8630  Progress: 4188 on 8630  Progress: 4189 on 8630  Progress: 4190 on 8630  Progress: 4191 on 8630  Progress: 4192 on 8630  Progress: 4193 on 8630  Progress: 4194 on 8630  Progress: 4195 on 8630  Progress: 4196 on 8630  Progress: 4197 on 8630  Progress: 4198 on 8630  Progress: 4199 on 8630  Progress: 4200 on 8630  Progress: 4201 on 8630  Progress: 4202 on 8630  Progress: 4203 on 8630  Progress: 4204 on 8630  Progress: 4205 on 8630  Progress: 4206 on 8630  Progress: 4207 on 8630  Progress: 4208 on 8630  Progress: 4209 on 8630  Progress: 4210 on 8630  Progress: 4211 on 8630  Progress: 4212 on 8630  Progress: 4213 on 8630  Progress: 4214 on 8630  Progress: 4215 on 8630  Progress: 4216 on 8630  Progress: 4217 on 8630  Progress: 4218 on 8630  Progress: 4219 on 8630  Progress: 4220 on 8630  Progress: 4221 on 8630  Progress: 4222 on 8630  Progress: 4223 on 8630  Progress: 4224 on 8630  Progress: 4225 on 8630  Progress: 4226 on 8630  Progress: 4227 on 8630  Progress: 4228 on 8630  Progress: 4229 on 8630  Progress: 4230 on 8630  Progress: 4231 on 8630  Progress: 4232 on 8630  Progress: 4233 on 8630  Progress: 4234 on 8630  Progress: 4235 on 8630  Progress: 4236 on 8630  Progress: 4237 on 8630  Progress: 4238 on 8630  Progress: 4239 on 8630  Progress: 4240 on 8630  Progress: 4241 on 8630  Progress: 4242 on 8630  Progress: 4243 on 8630  Progress: 4244 on 8630  Progress: 4245 on 8630  Progress: 4246 on 8630  Progress: 4247 on 8630  Progress: 4248 on 8630  Progress: 4249 on 8630  Progress: 4250 on 8630  Progress: 4251 on 8630  Progress: 4252 on 8630  Progress: 4253 on 8630  Progress: 4254 on 8630  Progress: 4255 on 8630  Progress: 4256 on 8630  Progress: 4257 on 8630  Progress: 4258 on 8630  Progress: 4259 on 8630  Progress: 4260 on 8630  Progress: 4261 on 8630  Progress: 4262 on 8630  Progress: 4263 on 8630  Progress: 4264 on 8630  Progress: 4265 on 8630  Progress: 4266 on 8630  Progress: 4267 on 8630  Progress: 4268 on 8630  Progress: 4269 on 8630  Progress: 4270 on 8630  Progress: 4271 on 8630  Progress: 4272 on 8630  Progress: 4273 on 8630  Progress: 4274 on 8630  Progress: 4275 on 8630  Progress: 4276 on 8630  Progress: 4277 on 8630  Progress: 4278 on 8630  Progress: 4279 on 8630  Progress: 4280 on 8630  Progress: 4281 on 8630  Progress: 4282 on 8630  Progress: 4283 on 8630  Progress: 4284 on 8630  Progress: 4285 on 8630  Progress: 4286 on 8630  Progress: 4287 on 8630  Progress: 4288 on 8630  Progress: 4289 on 8630  Progress: 4290 on 8630  Progress: 4291 on 8630  Progress: 4292 on 8630  Progress: 4293 on 8630  Progress: 4294 on 8630  Progress: 4295 on 8630  Progress: 4296 on 8630  Progress: 4297 on 8630  Progress: 4298 on 8630  Progress: 4299 on 8630  Progress: 4300 on 8630  Progress: 4301 on 8630  Progress: 4302 on 8630  Progress: 4303 on 8630  Progress: 4304 on 8630  Progress: 4305 on 8630  Progress: 4306 on 8630  Progress: 4307 on 8630  Progress: 4308 on 8630  Progress: 4309 on 8630  Progress: 4310 on 8630  Progress: 4311 on 8630  Progress: 4312 on 8630  Progress: 4313 on 8630  Progress: 4314 on 8630  Progress: 4315 on 8630  Progress: 4316 on 8630  Progress: 4317 on 8630  Progress: 4318 on 8630  Progress: 4319 on 8630  Progress: 4320 on 8630  Progress: 4321 on 8630  Progress: 4322 on 8630  Progress: 4323 on 8630  Progress: 4324 on 8630  Progress: 4325 on 8630  Progress: 4326 on 8630  Progress: 4327 on 8630  Progress: 4328 on 8630  Progress: 4329 on 8630  Progress: 4330 on 8630  Progress: 4331 on 8630  Progress: 4332 on 8630  Progress: 4333 on 8630  Progress: 4334 on 8630  Progress: 4335 on 8630  Progress: 4336 on 8630  Progress: 4337 on 8630  Progress: 4338 on 8630  Progress: 4339 on 8630  Progress: 4340 on 8630  Progress: 4341 on 8630  Progress: 4342 on 8630  Progress: 4343 on 8630  Progress: 4344 on 8630  Progress: 4345 on 8630  Progress: 4346 on 8630  Progress: 4347 on 8630  Progress: 4348 on 8630  Progress: 4349 on 8630  Progress: 4350 on 8630  Progress: 4351 on 8630  Progress: 4352 on 8630  Progress: 4353 on 8630  Progress: 4354 on 8630  Progress: 4355 on 8630  Progress: 4356 on 8630  Progress: 4357 on 8630  Progress: 4358 on 8630  Progress: 4359 on 8630  Progress: 4360 on 8630  Progress: 4361 on 8630  Progress: 4362 on 8630  Progress: 4363 on 8630  Progress: 4364 on 8630  Progress: 4365 on 8630  Progress: 4366 on 8630  Progress: 4367 on 8630  Progress: 4368 on 8630  Progress: 4369 on 8630  Progress: 4370 on 8630  Progress: 4371 on 8630  Progress: 4372 on 8630  Progress: 4373 on 8630  Progress: 4374 on 8630  Progress: 4375 on 8630  Progress: 4376 on 8630  Progress: 4377 on 8630  Progress: 4378 on 8630  Progress: 4379 on 8630  Progress: 4380 on 8630  Progress: 4381 on 8630  Progress: 4382 on 8630  Progress: 4383 on 8630  Progress: 4384 on 8630  Progress: 4385 on 8630  Progress: 4386 on 8630  Progress: 4387 on 8630  Progress: 4388 on 8630  Progress: 4389 on 8630  Progress: 4390 on 8630  Progress: 4391 on 8630  Progress: 4392 on 8630  Progress: 4393 on 8630  Progress: 4394 on 8630  Progress: 4395 on 8630  Progress: 4396 on 8630  Progress: 4397 on 8630  Progress: 4398 on 8630  Progress: 4399 on 8630  Progress: 4400 on 8630  Progress: 4401 on 8630  Progress: 4402 on 8630  Progress: 4403 on 8630  Progress: 4404 on 8630  Progress: 4405 on 8630  Progress: 4406 on 8630  Progress: 4407 on 8630  Progress: 4408 on 8630  Progress: 4409 on 8630  Progress: 4410 on 8630  Progress: 4411 on 8630  Progress: 4412 on 8630  Progress: 4413 on 8630  Progress: 4414 on 8630  Progress: 4415 on 8630  Progress: 4416 on 8630  Progress: 4417 on 8630  Progress: 4418 on 8630  Progress: 4419 on 8630  Progress: 4420 on 8630  Progress: 4421 on 8630  Progress: 4422 on 8630  Progress: 4423 on 8630  Progress: 4424 on 8630  Progress: 4425 on 8630  Progress: 4426 on 8630  Progress: 4427 on 8630  Progress: 4428 on 8630  Progress: 4429 on 8630  Progress: 4430 on 8630  Progress: 4431 on 8630  Progress: 4432 on 8630  Progress: 4433 on 8630  Progress: 4434 on 8630  Progress: 4435 on 8630  Progress: 4436 on 8630  Progress: 4437 on 8630  Progress: 4438 on 8630  Progress: 4439 on 8630  Progress: 4440 on 8630  Progress: 4441 on 8630  Progress: 4442 on 8630  Progress: 4443 on 8630  Progress: 4444 on 8630  Progress: 4445 on 8630  Progress: 4446 on 8630  Progress: 4447 on 8630  Progress: 4448 on 8630  Progress: 4449 on 8630  Progress: 4450 on 8630  Progress: 4451 on 8630  Progress: 4452 on 8630  Progress: 4453 on 8630  Progress: 4454 on 8630  Progress: 4455 on 8630  Progress: 4456 on 8630  Progress: 4457 on 8630  Progress: 4458 on 8630  Progress: 4459 on 8630  Progress: 4460 on 8630  Progress: 4461 on 8630  Progress: 4462 on 8630  Progress: 4463 on 8630  Progress: 4464 on 8630  Progress: 4465 on 8630  Progress: 4466 on 8630  Progress: 4467 on 8630  Progress: 4468 on 8630  Progress: 4469 on 8630  Progress: 4470 on 8630  Progress: 4471 on 8630  Progress: 4472 on 8630  Progress: 4473 on 8630  Progress: 4474 on 8630  Progress: 4475 on 8630  Progress: 4476 on 8630  Progress: 4477 on 8630  Progress: 4478 on 8630  Progress: 4479 on 8630  Progress: 4480 on 8630  Progress: 4481 on 8630  Progress: 4482 on 8630  Progress: 4483 on 8630  Progress: 4484 on 8630  Progress: 4485 on 8630  Progress: 4486 on 8630  Progress: 4487 on 8630  Progress: 4488 on 8630  Progress: 4489 on 8630  Progress: 4490 on 8630  Progress: 4491 on 8630  Progress: 4492 on 8630  Progress: 4493 on 8630  Progress: 4494 on 8630  Progress: 4495 on 8630  Progress: 4496 on 8630  Progress: 4497 on 8630  Progress: 4498 on 8630  Progress: 4499 on 8630  Progress: 4500 on 8630  Progress: 4501 on 8630  Progress: 4502 on 8630  Progress: 4503 on 8630  Progress: 4504 on 8630  Progress: 4505 on 8630  Progress: 4506 on 8630  Progress: 4507 on 8630  Progress: 4508 on 8630  Progress: 4509 on 8630  Progress: 4510 on 8630  Progress: 4511 on 8630  Progress: 4512 on 8630  Progress: 4513 on 8630  Progress: 4514 on 8630  Progress: 4515 on 8630  Progress: 4516 on 8630  Progress: 4517 on 8630  Progress: 4518 on 8630  Progress: 4519 on 8630  Progress: 4520 on 8630  Progress: 4521 on 8630  Progress: 4522 on 8630  Progress: 4523 on 8630  Progress: 4524 on 8630  Progress: 4525 on 8630  Progress: 4526 on 8630  Progress: 4527 on 8630  Progress: 4528 on 8630  Progress: 4529 on 8630  Progress: 4530 on 8630  Progress: 4531 on 8630  Progress: 4532 on 8630  Progress: 4533 on 8630  Progress: 4534 on 8630  Progress: 4535 on 8630  Progress: 4536 on 8630  Progress: 4537 on 8630  Progress: 4538 on 8630  Progress: 4539 on 8630  Progress: 4540 on 8630  Progress: 4541 on 8630  Progress: 4542 on 8630  Progress: 4543 on 8630  Progress: 4544 on 8630  Progress: 4545 on 8630  Progress: 4546 on 8630  Progress: 4547 on 8630  Progress: 4548 on 8630  Progress: 4549 on 8630  Progress: 4550 on 8630  Progress: 4551 on 8630  Progress: 4552 on 8630  Progress: 4553 on 8630  Progress: 4554 on 8630  Progress: 4555 on 8630  Progress: 4556 on 8630  Progress: 4557 on 8630  Progress: 4558 on 8630  Progress: 4559 on 8630  Progress: 4560 on 8630  Progress: 4561 on 8630  Progress: 4562 on 8630  Progress: 4563 on 8630  Progress: 4564 on 8630  Progress: 4565 on 8630  Progress: 4566 on 8630  Progress: 4567 on 8630  Progress: 4568 on 8630  Progress: 4569 on 8630  Progress: 4570 on 8630  Progress: 4571 on 8630  Progress: 4572 on 8630  Progress: 4573 on 8630  Progress: 4574 on 8630  Progress: 4575 on 8630  Progress: 4576 on 8630  Progress: 4577 on 8630  Progress: 4578 on 8630  Progress: 4579 on 8630  Progress: 4580 on 8630  Progress: 4581 on 8630  Progress: 4582 on 8630  Progress: 4583 on 8630  Progress: 4584 on 8630  Progress: 4585 on 8630  Progress: 4586 on 8630  Progress: 4587 on 8630  Progress: 4588 on 8630  Progress: 4589 on 8630  Progress: 4590 on 8630  Progress: 4591 on 8630  Progress: 4592 on 8630  Progress: 4593 on 8630  Progress: 4594 on 8630  Progress: 4595 on 8630  Progress: 4596 on 8630  Progress: 4597 on 8630  Progress: 4598 on 8630  Progress: 4599 on 8630  Progress: 4600 on 8630  Progress: 4601 on 8630  Progress: 4602 on 8630  Progress: 4603 on 8630  Progress: 4604 on 8630  Progress: 4605 on 8630  Progress: 4606 on 8630  Progress: 4607 on 8630  Progress: 4608 on 8630  Progress: 4609 on 8630  Progress: 4610 on 8630  Progress: 4611 on 8630  Progress: 4612 on 8630  Progress: 4613 on 8630  Progress: 4614 on 8630  Progress: 4615 on 8630  Progress: 4616 on 8630  Progress: 4617 on 8630  Progress: 4618 on 8630  Progress: 4619 on 8630  Progress: 4620 on 8630  Progress: 4621 on 8630  Progress: 4622 on 8630  Progress: 4623 on 8630  Progress: 4624 on 8630  Progress: 4625 on 8630  Progress: 4626 on 8630  Progress: 4627 on 8630  Progress: 4628 on 8630  Progress: 4629 on 8630  Progress: 4630 on 8630  Progress: 4631 on 8630  Progress: 4632 on 8630  Progress: 4633 on 8630  Progress: 4634 on 8630  Progress: 4635 on 8630  Progress: 4636 on 8630  Progress: 4637 on 8630  Progress: 4638 on 8630  Progress: 4639 on 8630  Progress: 4640 on 8630  Progress: 4641 on 8630  Progress: 4642 on 8630  Progress: 4643 on 8630  Progress: 4644 on 8630  Progress: 4645 on 8630  Progress: 4646 on 8630  Progress: 4647 on 8630  Progress: 4648 on 8630  Progress: 4649 on 8630  Progress: 4650 on 8630  Progress: 4651 on 8630  Progress: 4652 on 8630  Progress: 4653 on 8630  Progress: 4654 on 8630  Progress: 4655 on 8630  Progress: 4656 on 8630  Progress: 4657 on 8630  Progress: 4658 on 8630  Progress: 4659 on 8630  Progress: 4660 on 8630  Progress: 4661 on 8630  Progress: 4662 on 8630  Progress: 4663 on 8630  Progress: 4664 on 8630  Progress: 4665 on 8630  Progress: 4666 on 8630  Progress: 4667 on 8630  Progress: 4668 on 8630  Progress: 4669 on 8630  Progress: 4670 on 8630  Progress: 4671 on 8630  Progress: 4672 on 8630  Progress: 4673 on 8630  Progress: 4674 on 8630  Progress: 4675 on 8630  Progress: 4676 on 8630  Progress: 4677 on 8630  Progress: 4678 on 8630  Progress: 4679 on 8630  Progress: 4680 on 8630  Progress: 4681 on 8630  Progress: 4682 on 8630  Progress: 4683 on 8630  Progress: 4684 on 8630  Progress: 4685 on 8630  Progress: 4686 on 8630  Progress: 4687 on 8630  Progress: 4688 on 8630  Progress: 4689 on 8630  Progress: 4690 on 8630  Progress: 4691 on 8630  Progress: 4692 on 8630  Progress: 4693 on 8630  Progress: 4694 on 8630  Progress: 4695 on 8630  Progress: 4696 on 8630  Progress: 4697 on 8630  Progress: 4698 on 8630  Progress: 4699 on 8630  Progress: 4700 on 8630  Progress: 4701 on 8630  Progress: 4702 on 8630  Progress: 4703 on 8630  Progress: 4704 on 8630  Progress: 4705 on 8630  Progress: 4706 on 8630  Progress: 4707 on 8630  Progress: 4708 on 8630  Progress: 4709 on 8630  Progress: 4710 on 8630  Progress: 4711 on 8630  Progress: 4712 on 8630  Progress: 4713 on 8630  Progress: 4714 on 8630  Progress: 4715 on 8630  Progress: 4716 on 8630  Progress: 4717 on 8630  Progress: 4718 on 8630  Progress: 4719 on 8630  Progress: 4720 on 8630  Progress: 4721 on 8630  Progress: 4722 on 8630  Progress: 4723 on 8630  Progress: 4724 on 8630  Progress: 4725 on 8630  Progress: 4726 on 8630  Progress: 4727 on 8630  Progress: 4728 on 8630  Progress: 4729 on 8630  Progress: 4730 on 8630  Progress: 4731 on 8630  Progress: 4732 on 8630  Progress: 4733 on 8630  Progress: 4734 on 8630  Progress: 4735 on 8630  Progress: 4736 on 8630  Progress: 4737 on 8630  Progress: 4738 on 8630  Progress: 4739 on 8630  Progress: 4740 on 8630  Progress: 4741 on 8630  Progress: 4742 on 8630  Progress: 4743 on 8630  Progress: 4744 on 8630  Progress: 4745 on 8630  Progress: 4746 on 8630  Progress: 4747 on 8630  Progress: 4748 on 8630  Progress: 4749 on 8630  Progress: 4750 on 8630  Progress: 4751 on 8630  Progress: 4752 on 8630  Progress: 4753 on 8630  Progress: 4754 on 8630  Progress: 4755 on 8630  Progress: 4756 on 8630  Progress: 4757 on 8630  Progress: 4758 on 8630  Progress: 4759 on 8630  Progress: 4760 on 8630  Progress: 4761 on 8630  Progress: 4762 on 8630  Progress: 4763 on 8630  Progress: 4764 on 8630  Progress: 4765 on 8630  Progress: 4766 on 8630  Progress: 4767 on 8630  Progress: 4768 on 8630  Progress: 4769 on 8630  Progress: 4770 on 8630  Progress: 4771 on 8630  Progress: 4772 on 8630  Progress: 4773 on 8630  Progress: 4774 on 8630  Progress: 4775 on 8630  Progress: 4776 on 8630  Progress: 4777 on 8630  Progress: 4778 on 8630  Progress: 4779 on 8630  Progress: 4780 on 8630  Progress: 4781 on 8630  Progress: 4782 on 8630  Progress: 4783 on 8630  Progress: 4784 on 8630  Progress: 4785 on 8630  Progress: 4786 on 8630  Progress: 4787 on 8630  Progress: 4788 on 8630  Progress: 4789 on 8630  Progress: 4790 on 8630  Progress: 4791 on 8630  Progress: 4792 on 8630  Progress: 4793 on 8630  Progress: 4794 on 8630  Progress: 4795 on 8630  Progress: 4796 on 8630  Progress: 4797 on 8630  Progress: 4798 on 8630  Progress: 4799 on 8630  Progress: 4800 on 8630  Progress: 4801 on 8630  Progress: 4802 on 8630  Progress: 4803 on 8630  Progress: 4804 on 8630  Progress: 4805 on 8630  Progress: 4806 on 8630  Progress: 4807 on 8630  Progress: 4808 on 8630  Progress: 4809 on 8630  Progress: 4810 on 8630  Progress: 4811 on 8630  Progress: 4812 on 8630  Progress: 4813 on 8630  Progress: 4814 on 8630  Progress: 4815 on 8630  Progress: 4816 on 8630  Progress: 4817 on 8630  Progress: 4818 on 8630  Progress: 4819 on 8630  Progress: 4820 on 8630  Progress: 4821 on 8630  Progress: 4822 on 8630  Progress: 4823 on 8630  Progress: 4824 on 8630  Progress: 4825 on 8630  Progress: 4826 on 8630  Progress: 4827 on 8630  Progress: 4828 on 8630  Progress: 4829 on 8630  Progress: 4830 on 8630  Progress: 4831 on 8630  Progress: 4832 on 8630  Progress: 4833 on 8630  Progress: 4834 on 8630  Progress: 4835 on 8630  Progress: 4836 on 8630  Progress: 4837 on 8630  Progress: 4838 on 8630  Progress: 4839 on 8630  Progress: 4840 on 8630  Progress: 4841 on 8630  Progress: 4842 on 8630  Progress: 4843 on 8630  Progress: 4844 on 8630  Progress: 4845 on 8630  Progress: 4846 on 8630  Progress: 4847 on 8630  Progress: 4848 on 8630  Progress: 4849 on 8630  Progress: 4850 on 8630  Progress: 4851 on 8630  Progress: 4852 on 8630  Progress: 4853 on 8630  Progress: 4854 on 8630  Progress: 4855 on 8630  Progress: 4856 on 8630  Progress: 4857 on 8630  Progress: 4858 on 8630  Progress: 4859 on 8630  Progress: 4860 on 8630  Progress: 4861 on 8630  Progress: 4862 on 8630  Progress: 4863 on 8630  Progress: 4864 on 8630  Progress: 4865 on 8630  Progress: 4866 on 8630  Progress: 4867 on 8630  Progress: 4868 on 8630  Progress: 4869 on 8630  Progress: 4870 on 8630  Progress: 4871 on 8630  Progress: 4872 on 8630  Progress: 4873 on 8630  Progress: 4874 on 8630  Progress: 4875 on 8630  Progress: 4876 on 8630  Progress: 4877 on 8630  Progress: 4878 on 8630  Progress: 4879 on 8630  Progress: 4880 on 8630  Progress: 4881 on 8630  Progress: 4882 on 8630  Progress: 4883 on 8630  Progress: 4884 on 8630  Progress: 4885 on 8630  Progress: 4886 on 8630  Progress: 4887 on 8630  Progress: 4888 on 8630  Progress: 4889 on 8630  Progress: 4890 on 8630  Progress: 4891 on 8630  Progress: 4892 on 8630  Progress: 4893 on 8630  Progress: 4894 on 8630  Progress: 4895 on 8630  Progress: 4896 on 8630  Progress: 4897 on 8630  Progress: 4898 on 8630  Progress: 4899 on 8630  Progress: 4900 on 8630  Progress: 4901 on 8630  Progress: 4902 on 8630  Progress: 4903 on 8630  Progress: 4904 on 8630  Progress: 4905 on 8630  Progress: 4906 on 8630  Progress: 4907 on 8630  Progress: 4908 on 8630  Progress: 4909 on 8630  Progress: 4910 on 8630  Progress: 4911 on 8630  Progress: 4912 on 8630  Progress: 4913 on 8630  Progress: 4914 on 8630  Progress: 4915 on 8630  Progress: 4916 on 8630  Progress: 4917 on 8630  Progress: 4918 on 8630  Progress: 4919 on 8630  Progress: 4920 on 8630  Progress: 4921 on 8630  Progress: 4922 on 8630  Progress: 4923 on 8630  Progress: 4924 on 8630  Progress: 4925 on 8630  Progress: 4926 on 8630  Progress: 4927 on 8630  Progress: 4928 on 8630  Progress: 4929 on 8630  Progress: 4930 on 8630  Progress: 4931 on 8630  Progress: 4932 on 8630  Progress: 4933 on 8630  Progress: 4934 on 8630  Progress: 4935 on 8630  Progress: 4936 on 8630  Progress: 4937 on 8630  Progress: 4938 on 8630  Progress: 4939 on 8630  Progress: 4940 on 8630  Progress: 4941 on 8630  Progress: 4942 on 8630  Progress: 4943 on 8630  Progress: 4944 on 8630  Progress: 4945 on 8630  Progress: 4946 on 8630  Progress: 4947 on 8630  Progress: 4948 on 8630  Progress: 4949 on 8630  Progress: 4950 on 8630  Progress: 4951 on 8630  Progress: 4952 on 8630  Progress: 4953 on 8630  Progress: 4954 on 8630  Progress: 4955 on 8630  Progress: 4956 on 8630  Progress: 4957 on 8630  Progress: 4958 on 8630  Progress: 4959 on 8630  Progress: 4960 on 8630  Progress: 4961 on 8630  Progress: 4962 on 8630  Progress: 4963 on 8630  Progress: 4964 on 8630  Progress: 4965 on 8630  Progress: 4966 on 8630  Progress: 4967 on 8630  Progress: 4968 on 8630  Progress: 4969 on 8630  Progress: 4970 on 8630  Progress: 4971 on 8630  Progress: 4972 on 8630  Progress: 4973 on 8630  Progress: 4974 on 8630  Progress: 4975 on 8630  Progress: 4976 on 8630  Progress: 4977 on 8630  Progress: 4978 on 8630  Progress: 4979 on 8630  Progress: 4980 on 8630  Progress: 4981 on 8630  Progress: 4982 on 8630  Progress: 4983 on 8630  Progress: 4984 on 8630  Progress: 4985 on 8630  Progress: 4986 on 8630  Progress: 4987 on 8630  Progress: 4988 on 8630  Progress: 4989 on 8630  Progress: 4990 on 8630  Progress: 4991 on 8630  Progress: 4992 on 8630  Progress: 4993 on 8630  Progress: 4994 on 8630  Progress: 4995 on 8630  Progress: 4996 on 8630  Progress: 4997 on 8630  Progress: 4998 on 8630  Progress: 4999 on 8630  Progress: 5000 on 8630  Progress: 5001 on 8630  Progress: 5002 on 8630  Progress: 5003 on 8630  Progress: 5004 on 8630  Progress: 5005 on 8630  Progress: 5006 on 8630  Progress: 5007 on 8630  Progress: 5008 on 8630  Progress: 5009 on 8630  Progress: 5010 on 8630  Progress: 5011 on 8630  Progress: 5012 on 8630  Progress: 5013 on 8630  Progress: 5014 on 8630  Progress: 5015 on 8630  Progress: 5016 on 8630  Progress: 5017 on 8630  Progress: 5018 on 8630  Progress: 5019 on 8630  Progress: 5020 on 8630  Progress: 5021 on 8630  Progress: 5022 on 8630  Progress: 5023 on 8630  Progress: 5024 on 8630  Progress: 5025 on 8630  Progress: 5026 on 8630  Progress: 5027 on 8630  Progress: 5028 on 8630  Progress: 5029 on 8630  Progress: 5030 on 8630  Progress: 5031 on 8630  Progress: 5032 on 8630  Progress: 5033 on 8630  Progress: 5034 on 8630  Progress: 5035 on 8630  Progress: 5036 on 8630  Progress: 5037 on 8630  Progress: 5038 on 8630  Progress: 5039 on 8630  Progress: 5040 on 8630  Progress: 5041 on 8630  Progress: 5042 on 8630  Progress: 5043 on 8630  Progress: 5044 on 8630  Progress: 5045 on 8630  Progress: 5046 on 8630  Progress: 5047 on 8630  Progress: 5048 on 8630  Progress: 5049 on 8630  Progress: 5050 on 8630  Progress: 5051 on 8630  Progress: 5052 on 8630  Progress: 5053 on 8630  Progress: 5054 on 8630  Progress: 5055 on 8630  Progress: 5056 on 8630  Progress: 5057 on 8630  Progress: 5058 on 8630  Progress: 5059 on 8630  Progress: 5060 on 8630  Progress: 5061 on 8630  Progress: 5062 on 8630  Progress: 5063 on 8630  Progress: 5064 on 8630  Progress: 5065 on 8630  Progress: 5066 on 8630  Progress: 5067 on 8630  Progress: 5068 on 8630  Progress: 5069 on 8630  Progress: 5070 on 8630  Progress: 5071 on 8630  Progress: 5072 on 8630  Progress: 5073 on 8630  Progress: 5074 on 8630  Progress: 5075 on 8630  Progress: 5076 on 8630  Progress: 5077 on 8630  Progress: 5078 on 8630  Progress: 5079 on 8630  Progress: 5080 on 8630  Progress: 5081 on 8630  Progress: 5082 on 8630  Progress: 5083 on 8630  Progress: 5084 on 8630  Progress: 5085 on 8630  Progress: 5086 on 8630  Progress: 5087 on 8630  Progress: 5088 on 8630  Progress: 5089 on 8630  Progress: 5090 on 8630  Progress: 5091 on 8630  Progress: 5092 on 8630  Progress: 5093 on 8630  Progress: 5094 on 8630  Progress: 5095 on 8630  Progress: 5096 on 8630  Progress: 5097 on 8630  Progress: 5098 on 8630  Progress: 5099 on 8630  Progress: 5100 on 8630  Progress: 5101 on 8630  Progress: 5102 on 8630  Progress: 5103 on 8630  Progress: 5104 on 8630  Progress: 5105 on 8630  Progress: 5106 on 8630  Progress: 5107 on 8630  Progress: 5108 on 8630  Progress: 5109 on 8630  Progress: 5110 on 8630  Progress: 5111 on 8630  Progress: 5112 on 8630  Progress: 5113 on 8630  Progress: 5114 on 8630  Progress: 5115 on 8630  Progress: 5116 on 8630  Progress: 5117 on 8630  Progress: 5118 on 8630  Progress: 5119 on 8630  Progress: 5120 on 8630  Progress: 5121 on 8630  Progress: 5122 on 8630  Progress: 5123 on 8630  Progress: 5124 on 8630  Progress: 5125 on 8630  Progress: 5126 on 8630  Progress: 5127 on 8630  Progress: 5128 on 8630  Progress: 5129 on 8630  Progress: 5130 on 8630  Progress: 5131 on 8630  Progress: 5132 on 8630  Progress: 5133 on 8630  Progress: 5134 on 8630  Progress: 5135 on 8630  Progress: 5136 on 8630  Progress: 5137 on 8630  Progress: 5138 on 8630  Progress: 5139 on 8630  Progress: 5140 on 8630  Progress: 5141 on 8630  Progress: 5142 on 8630  Progress: 5143 on 8630  Progress: 5144 on 8630  Progress: 5145 on 8630  Progress: 5146 on 8630  Progress: 5147 on 8630  Progress: 5148 on 8630  Progress: 5149 on 8630  Progress: 5150 on 8630  Progress: 5151 on 8630  Progress: 5152 on 8630  Progress: 5153 on 8630  Progress: 5154 on 8630  Progress: 5155 on 8630  Progress: 5156 on 8630  Progress: 5157 on 8630  Progress: 5158 on 8630  Progress: 5159 on 8630  Progress: 5160 on 8630  Progress: 5161 on 8630  Progress: 5162 on 8630  Progress: 5163 on 8630  Progress: 5164 on 8630  Progress: 5165 on 8630  Progress: 5166 on 8630  Progress: 5167 on 8630  Progress: 5168 on 8630  Progress: 5169 on 8630  Progress: 5170 on 8630  Progress: 5171 on 8630  Progress: 5172 on 8630  Progress: 5173 on 8630  Progress: 5174 on 8630  Progress: 5175 on 8630  Progress: 5176 on 8630  Progress: 5177 on 8630  Progress: 5178 on 8630  Progress: 5179 on 8630  Progress: 5180 on 8630  Progress: 5181 on 8630  Progress: 5182 on 8630  Progress: 5183 on 8630  Progress: 5184 on 8630  Progress: 5185 on 8630  Progress: 5186 on 8630  Progress: 5187 on 8630  Progress: 5188 on 8630  Progress: 5189 on 8630  Progress: 5190 on 8630  Progress: 5191 on 8630  Progress: 5192 on 8630  Progress: 5193 on 8630  Progress: 5194 on 8630  Progress: 5195 on 8630  Progress: 5196 on 8630  Progress: 5197 on 8630  Progress: 5198 on 8630  Progress: 5199 on 8630  Progress: 5200 on 8630  Progress: 5201 on 8630  Progress: 5202 on 8630  Progress: 5203 on 8630  Progress: 5204 on 8630  Progress: 5205 on 8630  Progress: 5206 on 8630  Progress: 5207 on 8630  Progress: 5208 on 8630  Progress: 5209 on 8630  Progress: 5210 on 8630  Progress: 5211 on 8630  Progress: 5212 on 8630  Progress: 5213 on 8630  Progress: 5214 on 8630  Progress: 5215 on 8630  Progress: 5216 on 8630  Progress: 5217 on 8630  Progress: 5218 on 8630  Progress: 5219 on 8630  Progress: 5220 on 8630  Progress: 5221 on 8630  Progress: 5222 on 8630  Progress: 5223 on 8630  Progress: 5224 on 8630  Progress: 5225 on 8630  Progress: 5226 on 8630  Progress: 5227 on 8630  Progress: 5228 on 8630  Progress: 5229 on 8630  Progress: 5230 on 8630  Progress: 5231 on 8630  Progress: 5232 on 8630  Progress: 5233 on 8630  Progress: 5234 on 8630  Progress: 5235 on 8630  Progress: 5236 on 8630  Progress: 5237 on 8630  Progress: 5238 on 8630  Progress: 5239 on 8630  Progress: 5240 on 8630  Progress: 5241 on 8630  Progress: 5242 on 8630  Progress: 5243 on 8630  Progress: 5244 on 8630  Progress: 5245 on 8630  Progress: 5246 on 8630  Progress: 5247 on 8630  Progress: 5248 on 8630  Progress: 5249 on 8630  Progress: 5250 on 8630  Progress: 5251 on 8630  Progress: 5252 on 8630  Progress: 5253 on 8630  Progress: 5254 on 8630  Progress: 5255 on 8630  Progress: 5256 on 8630  Progress: 5257 on 8630  Progress: 5258 on 8630  Progress: 5259 on 8630  Progress: 5260 on 8630  Progress: 5261 on 8630  Progress: 5262 on 8630  Progress: 5263 on 8630  Progress: 5264 on 8630  Progress: 5265 on 8630  Progress: 5266 on 8630  Progress: 5267 on 8630  Progress: 5268 on 8630  Progress: 5269 on 8630  Progress: 5270 on 8630  Progress: 5271 on 8630  Progress: 5272 on 8630  Progress: 5273 on 8630  Progress: 5274 on 8630  Progress: 5275 on 8630  Progress: 5276 on 8630  Progress: 5277 on 8630  Progress: 5278 on 8630  Progress: 5279 on 8630  Progress: 5280 on 8630  Progress: 5281 on 8630  Progress: 5282 on 8630  Progress: 5283 on 8630  Progress: 5284 on 8630  Progress: 5285 on 8630  Progress: 5286 on 8630  Progress: 5287 on 8630  Progress: 5288 on 8630  Progress: 5289 on 8630  Progress: 5290 on 8630  Progress: 5291 on 8630  Progress: 5292 on 8630  Progress: 5293 on 8630  Progress: 5294 on 8630  Progress: 5295 on 8630  Progress: 5296 on 8630  Progress: 5297 on 8630  Progress: 5298 on 8630  Progress: 5299 on 8630  Progress: 5300 on 8630  Progress: 5301 on 8630  Progress: 5302 on 8630  Progress: 5303 on 8630  Progress: 5304 on 8630  Progress: 5305 on 8630  Progress: 5306 on 8630  Progress: 5307 on 8630  Progress: 5308 on 8630  Progress: 5309 on 8630  Progress: 5310 on 8630  Progress: 5311 on 8630  Progress: 5312 on 8630  Progress: 5313 on 8630  Progress: 5314 on 8630  Progress: 5315 on 8630  Progress: 5316 on 8630  Progress: 5317 on 8630  Progress: 5318 on 8630  Progress: 5319 on 8630  Progress: 5320 on 8630  Progress: 5321 on 8630  Progress: 5322 on 8630  Progress: 5323 on 8630  Progress: 5324 on 8630  Progress: 5325 on 8630  Progress: 5326 on 8630  Progress: 5327 on 8630  Progress: 5328 on 8630  Progress: 5329 on 8630  Progress: 5330 on 8630  Progress: 5331 on 8630  Progress: 5332 on 8630  Progress: 5333 on 8630  Progress: 5334 on 8630  Progress: 5335 on 8630  Progress: 5336 on 8630  Progress: 5337 on 8630  Progress: 5338 on 8630  Progress: 5339 on 8630  Progress: 5340 on 8630  Progress: 5341 on 8630  Progress: 5342 on 8630  Progress: 5343 on 8630  Progress: 5344 on 8630  Progress: 5345 on 8630  Progress: 5346 on 8630  Progress: 5347 on 8630  Progress: 5348 on 8630  Progress: 5349 on 8630  Progress: 5350 on 8630  Progress: 5351 on 8630  Progress: 5352 on 8630  Progress: 5353 on 8630  Progress: 5354 on 8630  Progress: 5355 on 8630  Progress: 5356 on 8630  Progress: 5357 on 8630  Progress: 5358 on 8630  Progress: 5359 on 8630  Progress: 5360 on 8630  Progress: 5361 on 8630  Progress: 5362 on 8630  Progress: 5363 on 8630  Progress: 5364 on 8630  Progress: 5365 on 8630  Progress: 5366 on 8630  Progress: 5367 on 8630  Progress: 5368 on 8630  Progress: 5369 on 8630  Progress: 5370 on 8630  Progress: 5371 on 8630  Progress: 5372 on 8630  Progress: 5373 on 8630  Progress: 5374 on 8630  Progress: 5375 on 8630  Progress: 5376 on 8630  Progress: 5377 on 8630  Progress: 5378 on 8630  Progress: 5379 on 8630  Progress: 5380 on 8630  Progress: 5381 on 8630  Progress: 5382 on 8630  Progress: 5383 on 8630  Progress: 5384 on 8630  Progress: 5385 on 8630  Progress: 5386 on 8630  Progress: 5387 on 8630  Progress: 5388 on 8630  Progress: 5389 on 8630  Progress: 5390 on 8630  Progress: 5391 on 8630  Progress: 5392 on 8630  Progress: 5393 on 8630  Progress: 5394 on 8630  Progress: 5395 on 8630  Progress: 5396 on 8630  Progress: 5397 on 8630  Progress: 5398 on 8630  Progress: 5399 on 8630  Progress: 5400 on 8630  Progress: 5401 on 8630  Progress: 5402 on 8630  Progress: 5403 on 8630  Progress: 5404 on 8630  Progress: 5405 on 8630  Progress: 5406 on 8630  Progress: 5407 on 8630  Progress: 5408 on 8630  Progress: 5409 on 8630  Progress: 5410 on 8630  Progress: 5411 on 8630  Progress: 5412 on 8630  Progress: 5413 on 8630  Progress: 5414 on 8630  Progress: 5415 on 8630  Progress: 5416 on 8630  Progress: 5417 on 8630  Progress: 5418 on 8630  Progress: 5419 on 8630  Progress: 5420 on 8630  Progress: 5421 on 8630  Progress: 5422 on 8630  Progress: 5423 on 8630  Progress: 5424 on 8630  Progress: 5425 on 8630  Progress: 5426 on 8630  Progress: 5427 on 8630  Progress: 5428 on 8630  Progress: 5429 on 8630  Progress: 5430 on 8630  Progress: 5431 on 8630  Progress: 5432 on 8630  Progress: 5433 on 8630  Progress: 5434 on 8630  Progress: 5435 on 8630  Progress: 5436 on 8630  Progress: 5437 on 8630  Progress: 5438 on 8630  Progress: 5439 on 8630  Progress: 5440 on 8630  Progress: 5441 on 8630  Progress: 5442 on 8630  Progress: 5443 on 8630  Progress: 5444 on 8630  Progress: 5445 on 8630  Progress: 5446 on 8630  Progress: 5447 on 8630  Progress: 5448 on 8630  Progress: 5449 on 8630  Progress: 5450 on 8630  Progress: 5451 on 8630  Progress: 5452 on 8630  Progress: 5453 on 8630  Progress: 5454 on 8630  Progress: 5455 on 8630  Progress: 5456 on 8630  Progress: 5457 on 8630  Progress: 5458 on 8630  Progress: 5459 on 8630  Progress: 5460 on 8630  Progress: 5461 on 8630  Progress: 5462 on 8630  Progress: 5463 on 8630  Progress: 5464 on 8630  Progress: 5465 on 8630  Progress: 5466 on 8630  Progress: 5467 on 8630  Progress: 5468 on 8630  Progress: 5469 on 8630  Progress: 5470 on 8630  Progress: 5471 on 8630  Progress: 5472 on 8630  Progress: 5473 on 8630  Progress: 5474 on 8630  Progress: 5475 on 8630  Progress: 5476 on 8630  Progress: 5477 on 8630  Progress: 5478 on 8630  Progress: 5479 on 8630  Progress: 5480 on 8630  Progress: 5481 on 8630  Progress: 5482 on 8630  Progress: 5483 on 8630  Progress: 5484 on 8630  Progress: 5485 on 8630  Progress: 5486 on 8630  Progress: 5487 on 8630  Progress: 5488 on 8630  Progress: 5489 on 8630  Progress: 5490 on 8630  Progress: 5491 on 8630  Progress: 5492 on 8630  Progress: 5493 on 8630  Progress: 5494 on 8630  Progress: 5495 on 8630  Progress: 5496 on 8630  Progress: 5497 on 8630  Progress: 5498 on 8630  Progress: 5499 on 8630  Progress: 5500 on 8630  Progress: 5501 on 8630  Progress: 5502 on 8630  Progress: 5503 on 8630  Progress: 5504 on 8630  Progress: 5505 on 8630  Progress: 5506 on 8630  Progress: 5507 on 8630  Progress: 5508 on 8630  Progress: 5509 on 8630  Progress: 5510 on 8630  Progress: 5511 on 8630  Progress: 5512 on 8630  Progress: 5513 on 8630  Progress: 5514 on 8630  Progress: 5515 on 8630  Progress: 5516 on 8630  Progress: 5517 on 8630  Progress: 5518 on 8630  Progress: 5519 on 8630  Progress: 5520 on 8630  Progress: 5521 on 8630  Progress: 5522 on 8630  Progress: 5523 on 8630  Progress: 5524 on 8630  Progress: 5525 on 8630  Progress: 5526 on 8630  Progress: 5527 on 8630  Progress: 5528 on 8630  Progress: 5529 on 8630  Progress: 5530 on 8630  Progress: 5531 on 8630  Progress: 5532 on 8630  Progress: 5533 on 8630  Progress: 5534 on 8630  Progress: 5535 on 8630  Progress: 5536 on 8630  Progress: 5537 on 8630  Progress: 5538 on 8630  Progress: 5539 on 8630  Progress: 5540 on 8630  Progress: 5541 on 8630  Progress: 5542 on 8630  Progress: 5543 on 8630  Progress: 5544 on 8630  Progress: 5545 on 8630  Progress: 5546 on 8630  Progress: 5547 on 8630  Progress: 5548 on 8630  Progress: 5549 on 8630  Progress: 5550 on 8630  Progress: 5551 on 8630  Progress: 5552 on 8630  Progress: 5553 on 8630  Progress: 5554 on 8630  Progress: 5555 on 8630  Progress: 5556 on 8630  Progress: 5557 on 8630  Progress: 5558 on 8630  Progress: 5559 on 8630  Progress: 5560 on 8630  Progress: 5561 on 8630  Progress: 5562 on 8630  Progress: 5563 on 8630  Progress: 5564 on 8630  Progress: 5565 on 8630  Progress: 5566 on 8630  Progress: 5567 on 8630  Progress: 5568 on 8630  Progress: 5569 on 8630  Progress: 5570 on 8630  Progress: 5571 on 8630  Progress: 5572 on 8630  Progress: 5573 on 8630  Progress: 5574 on 8630  Progress: 5575 on 8630  Progress: 5576 on 8630  Progress: 5577 on 8630  Progress: 5578 on 8630  Progress: 5579 on 8630  Progress: 5580 on 8630  Progress: 5581 on 8630  Progress: 5582 on 8630  Progress: 5583 on 8630  Progress: 5584 on 8630  Progress: 5585 on 8630  Progress: 5586 on 8630  Progress: 5587 on 8630  Progress: 5588 on 8630  Progress: 5589 on 8630  Progress: 5590 on 8630  Progress: 5591 on 8630  Progress: 5592 on 8630  Progress: 5593 on 8630  Progress: 5594 on 8630  Progress: 5595 on 8630  Progress: 5596 on 8630  Progress: 5597 on 8630  Progress: 5598 on 8630  Progress: 5599 on 8630  Progress: 5600 on 8630  Progress: 5601 on 8630  Progress: 5602 on 8630  Progress: 5603 on 8630  Progress: 5604 on 8630  Progress: 5605 on 8630  Progress: 5606 on 8630  Progress: 5607 on 8630  Progress: 5608 on 8630  Progress: 5609 on 8630  Progress: 5610 on 8630  Progress: 5611 on 8630  Progress: 5612 on 8630  Progress: 5613 on 8630  Progress: 5614 on 8630  Progress: 5615 on 8630  Progress: 5616 on 8630  Progress: 5617 on 8630  Progress: 5618 on 8630  Progress: 5619 on 8630  Progress: 5620 on 8630  Progress: 5621 on 8630  Progress: 5622 on 8630  Progress: 5623 on 8630  Progress: 5624 on 8630  Progress: 5625 on 8630  Progress: 5626 on 8630  Progress: 5627 on 8630  Progress: 5628 on 8630  Progress: 5629 on 8630  Progress: 5630 on 8630  Progress: 5631 on 8630  Progress: 5632 on 8630  Progress: 5633 on 8630  Progress: 5634 on 8630  Progress: 5635 on 8630  Progress: 5636 on 8630  Progress: 5637 on 8630  Progress: 5638 on 8630  Progress: 5639 on 8630  Progress: 5640 on 8630  Progress: 5641 on 8630  Progress: 5642 on 8630  Progress: 5643 on 8630  Progress: 5644 on 8630  Progress: 5645 on 8630  Progress: 5646 on 8630  Progress: 5647 on 8630  Progress: 5648 on 8630  Progress: 5649 on 8630  Progress: 5650 on 8630  Progress: 5651 on 8630  Progress: 5652 on 8630  Progress: 5653 on 8630  Progress: 5654 on 8630  Progress: 5655 on 8630  Progress: 5656 on 8630  Progress: 5657 on 8630  Progress: 5658 on 8630  Progress: 5659 on 8630  Progress: 5660 on 8630  Progress: 5661 on 8630  Progress: 5662 on 8630  Progress: 5663 on 8630  Progress: 5664 on 8630  Progress: 5665 on 8630  Progress: 5666 on 8630  Progress: 5667 on 8630  Progress: 5668 on 8630  Progress: 5669 on 8630  Progress: 5670 on 8630  Progress: 5671 on 8630  Progress: 5672 on 8630  Progress: 5673 on 8630  Progress: 5674 on 8630  Progress: 5675 on 8630  Progress: 5676 on 8630  Progress: 5677 on 8630  Progress: 5678 on 8630  Progress: 5679 on 8630  Progress: 5680 on 8630  Progress: 5681 on 8630  Progress: 5682 on 8630  Progress: 5683 on 8630  Progress: 5684 on 8630  Progress: 5685 on 8630  Progress: 5686 on 8630  Progress: 5687 on 8630  Progress: 5688 on 8630  Progress: 5689 on 8630  Progress: 5690 on 8630  Progress: 5691 on 8630  Progress: 5692 on 8630  Progress: 5693 on 8630  Progress: 5694 on 8630  Progress: 5695 on 8630  Progress: 5696 on 8630  Progress: 5697 on 8630  Progress: 5698 on 8630  Progress: 5699 on 8630  Progress: 5700 on 8630  Progress: 5701 on 8630  Progress: 5702 on 8630  Progress: 5703 on 8630  Progress: 5704 on 8630  Progress: 5705 on 8630  Progress: 5706 on 8630  Progress: 5707 on 8630  Progress: 5708 on 8630  Progress: 5709 on 8630  Progress: 5710 on 8630  Progress: 5711 on 8630  Progress: 5712 on 8630  Progress: 5713 on 8630  Progress: 5714 on 8630  Progress: 5715 on 8630  Progress: 5716 on 8630  Progress: 5717 on 8630  Progress: 5718 on 8630  Progress: 5719 on 8630  Progress: 5720 on 8630  Progress: 5721 on 8630  Progress: 5722 on 8630  Progress: 5723 on 8630  Progress: 5724 on 8630  Progress: 5725 on 8630  Progress: 5726 on 8630  Progress: 5727 on 8630  Progress: 5728 on 8630  Progress: 5729 on 8630  Progress: 5730 on 8630  Progress: 5731 on 8630  Progress: 5732 on 8630  Progress: 5733 on 8630  Progress: 5734 on 8630  Progress: 5735 on 8630  Progress: 5736 on 8630  Progress: 5737 on 8630  Progress: 5738 on 8630  Progress: 5739 on 8630  Progress: 5740 on 8630  Progress: 5741 on 8630  Progress: 5742 on 8630  Progress: 5743 on 8630  Progress: 5744 on 8630  Progress: 5745 on 8630  Progress: 5746 on 8630  Progress: 5747 on 8630  Progress: 5748 on 8630  Progress: 5749 on 8630  Progress: 5750 on 8630  Progress: 5751 on 8630  Progress: 5752 on 8630  Progress: 5753 on 8630  Progress: 5754 on 8630  Progress: 5755 on 8630  Progress: 5756 on 8630  Progress: 5757 on 8630  Progress: 5758 on 8630  Progress: 5759 on 8630  Progress: 5760 on 8630  Progress: 5761 on 8630  Progress: 5762 on 8630  Progress: 5763 on 8630  Progress: 5764 on 8630  Progress: 5765 on 8630  Progress: 5766 on 8630  Progress: 5767 on 8630  Progress: 5768 on 8630  Progress: 5769 on 8630  Progress: 5770 on 8630  Progress: 5771 on 8630  Progress: 5772 on 8630  Progress: 5773 on 8630  Progress: 5774 on 8630  Progress: 5775 on 8630  Progress: 5776 on 8630  Progress: 5777 on 8630  Progress: 5778 on 8630  Progress: 5779 on 8630  Progress: 5780 on 8630  Progress: 5781 on 8630  Progress: 5782 on 8630  Progress: 5783 on 8630  Progress: 5784 on 8630  Progress: 5785 on 8630  Progress: 5786 on 8630  Progress: 5787 on 8630  Progress: 5788 on 8630  Progress: 5789 on 8630  Progress: 5790 on 8630  Progress: 5791 on 8630  Progress: 5792 on 8630  Progress: 5793 on 8630  Progress: 5794 on 8630  Progress: 5795 on 8630  Progress: 5796 on 8630  Progress: 5797 on 8630  Progress: 5798 on 8630  Progress: 5799 on 8630  Progress: 5800 on 8630  Progress: 5801 on 8630  Progress: 5802 on 8630  Progress: 5803 on 8630  Progress: 5804 on 8630  Progress: 5805 on 8630  Progress: 5806 on 8630  Progress: 5807 on 8630  Progress: 5808 on 8630  Progress: 5809 on 8630  Progress: 5810 on 8630  Progress: 5811 on 8630  Progress: 5812 on 8630  Progress: 5813 on 8630  Progress: 5814 on 8630  Progress: 5815 on 8630  Progress: 5816 on 8630  Progress: 5817 on 8630  Progress: 5818 on 8630  Progress: 5819 on 8630  Progress: 5820 on 8630  Progress: 5821 on 8630  Progress: 5822 on 8630  Progress: 5823 on 8630  Progress: 5824 on 8630  Progress: 5825 on 8630  Progress: 5826 on 8630  Progress: 5827 on 8630  Progress: 5828 on 8630  Progress: 5829 on 8630  Progress: 5830 on 8630  Progress: 5831 on 8630  Progress: 5832 on 8630  Progress: 5833 on 8630  Progress: 5834 on 8630  Progress: 5835 on 8630  Progress: 5836 on 8630  Progress: 5837 on 8630  Progress: 5838 on 8630  Progress: 5839 on 8630  Progress: 5840 on 8630  Progress: 5841 on 8630  Progress: 5842 on 8630  Progress: 5843 on 8630  Progress: 5844 on 8630  Progress: 5845 on 8630  Progress: 5846 on 8630  Progress: 5847 on 8630  Progress: 5848 on 8630  Progress: 5849 on 8630  Progress: 5850 on 8630  Progress: 5851 on 8630  Progress: 5852 on 8630  Progress: 5853 on 8630  Progress: 5854 on 8630  Progress: 5855 on 8630  Progress: 5856 on 8630  Progress: 5857 on 8630  Progress: 5858 on 8630  Progress: 5859 on 8630  Progress: 5860 on 8630  Progress: 5861 on 8630  Progress: 5862 on 8630  Progress: 5863 on 8630  Progress: 5864 on 8630  Progress: 5865 on 8630  Progress: 5866 on 8630  Progress: 5867 on 8630  Progress: 5868 on 8630  Progress: 5869 on 8630  Progress: 5870 on 8630  Progress: 5871 on 8630  Progress: 5872 on 8630  Progress: 5873 on 8630  Progress: 5874 on 8630  Progress: 5875 on 8630  Progress: 5876 on 8630  Progress: 5877 on 8630  Progress: 5878 on 8630  Progress: 5879 on 8630  Progress: 5880 on 8630  Progress: 5881 on 8630  Progress: 5882 on 8630  Progress: 5883 on 8630  Progress: 5884 on 8630  Progress: 5885 on 8630  Progress: 5886 on 8630  Progress: 5887 on 8630  Progress: 5888 on 8630  Progress: 5889 on 8630  Progress: 5890 on 8630  Progress: 5891 on 8630  Progress: 5892 on 8630  Progress: 5893 on 8630  Progress: 5894 on 8630  Progress: 5895 on 8630  Progress: 5896 on 8630  Progress: 5897 on 8630  Progress: 5898 on 8630  Progress: 5899 on 8630  Progress: 5900 on 8630  Progress: 5901 on 8630  Progress: 5902 on 8630  Progress: 5903 on 8630  Progress: 5904 on 8630  Progress: 5905 on 8630  Progress: 5906 on 8630  Progress: 5907 on 8630  Progress: 5908 on 8630  Progress: 5909 on 8630  Progress: 5910 on 8630  Progress: 5911 on 8630  Progress: 5912 on 8630  Progress: 5913 on 8630  Progress: 5914 on 8630  Progress: 5915 on 8630  Progress: 5916 on 8630  Progress: 5917 on 8630  Progress: 5918 on 8630  Progress: 5919 on 8630  Progress: 5920 on 8630  Progress: 5921 on 8630  Progress: 5922 on 8630  Progress: 5923 on 8630  Progress: 5924 on 8630  Progress: 5925 on 8630  Progress: 5926 on 8630  Progress: 5927 on 8630  Progress: 5928 on 8630  Progress: 5929 on 8630  Progress: 5930 on 8630  Progress: 5931 on 8630  Progress: 5932 on 8630  Progress: 5933 on 8630  Progress: 5934 on 8630  Progress: 5935 on 8630  Progress: 5936 on 8630  Progress: 5937 on 8630  Progress: 5938 on 8630  Progress: 5939 on 8630  Progress: 5940 on 8630  Progress: 5941 on 8630  Progress: 5942 on 8630  Progress: 5943 on 8630  Progress: 5944 on 8630  Progress: 5945 on 8630  Progress: 5946 on 8630  Progress: 5947 on 8630  Progress: 5948 on 8630  Progress: 5949 on 8630  Progress: 5950 on 8630  Progress: 5951 on 8630  Progress: 5952 on 8630  Progress: 5953 on 8630  Progress: 5954 on 8630  Progress: 5955 on 8630  Progress: 5956 on 8630  Progress: 5957 on 8630  Progress: 5958 on 8630  Progress: 5959 on 8630  Progress: 5960 on 8630  Progress: 5961 on 8630  Progress: 5962 on 8630  Progress: 5963 on 8630  Progress: 5964 on 8630  Progress: 5965 on 8630  Progress: 5966 on 8630  Progress: 5967 on 8630  Progress: 5968 on 8630  Progress: 5969 on 8630  Progress: 5970 on 8630  Progress: 5971 on 8630  Progress: 5972 on 8630  Progress: 5973 on 8630  Progress: 5974 on 8630  Progress: 5975 on 8630  Progress: 5976 on 8630  Progress: 5977 on 8630  Progress: 5978 on 8630  Progress: 5979 on 8630  Progress: 5980 on 8630  Progress: 5981 on 8630  Progress: 5982 on 8630  Progress: 5983 on 8630  Progress: 5984 on 8630  Progress: 5985 on 8630  Progress: 5986 on 8630  Progress: 5987 on 8630  Progress: 5988 on 8630  Progress: 5989 on 8630  Progress: 5990 on 8630  Progress: 5991 on 8630  Progress: 5992 on 8630  Progress: 5993 on 8630  Progress: 5994 on 8630  Progress: 5995 on 8630  Progress: 5996 on 8630  Progress: 5997 on 8630  Progress: 5998 on 8630  Progress: 5999 on 8630  Progress: 6000 on 8630  Progress: 6001 on 8630  Progress: 6002 on 8630  Progress: 6003 on 8630  Progress: 6004 on 8630  Progress: 6005 on 8630  Progress: 6006 on 8630  Progress: 6007 on 8630  Progress: 6008 on 8630  Progress: 6009 on 8630  Progress: 6010 on 8630  Progress: 6011 on 8630  Progress: 6012 on 8630  Progress: 6013 on 8630  Progress: 6014 on 8630  Progress: 6015 on 8630  Progress: 6016 on 8630  Progress: 6017 on 8630  Progress: 6018 on 8630  Progress: 6019 on 8630  Progress: 6020 on 8630  Progress: 6021 on 8630  Progress: 6022 on 8630  Progress: 6023 on 8630  Progress: 6024 on 8630  Progress: 6025 on 8630  Progress: 6026 on 8630  Progress: 6027 on 8630  Progress: 6028 on 8630  Progress: 6029 on 8630  Progress: 6030 on 8630  Progress: 6031 on 8630  Progress: 6032 on 8630  Progress: 6033 on 8630  Progress: 6034 on 8630  Progress: 6035 on 8630  Progress: 6036 on 8630  Progress: 6037 on 8630  Progress: 6038 on 8630  Progress: 6039 on 8630  Progress: 6040 on 8630  Progress: 6041 on 8630  Progress: 6042 on 8630  Progress: 6043 on 8630  Progress: 6044 on 8630  Progress: 6045 on 8630  Progress: 6046 on 8630  Progress: 6047 on 8630  Progress: 6048 on 8630  Progress: 6049 on 8630  Progress: 6050 on 8630  Progress: 6051 on 8630  Progress: 6052 on 8630  Progress: 6053 on 8630  Progress: 6054 on 8630  Progress: 6055 on 8630  Progress: 6056 on 8630  Progress: 6057 on 8630  Progress: 6058 on 8630  Progress: 6059 on 8630  Progress: 6060 on 8630  Progress: 6061 on 8630  Progress: 6062 on 8630  Progress: 6063 on 8630  Progress: 6064 on 8630  Progress: 6065 on 8630  Progress: 6066 on 8630  Progress: 6067 on 8630  Progress: 6068 on 8630  Progress: 6069 on 8630  Progress: 6070 on 8630  Progress: 6071 on 8630  Progress: 6072 on 8630  Progress: 6073 on 8630  Progress: 6074 on 8630  Progress: 6075 on 8630  Progress: 6076 on 8630  Progress: 6077 on 8630  Progress: 6078 on 8630  Progress: 6079 on 8630  Progress: 6080 on 8630  Progress: 6081 on 8630  Progress: 6082 on 8630  Progress: 6083 on 8630  Progress: 6084 on 8630  Progress: 6085 on 8630  Progress: 6086 on 8630  Progress: 6087 on 8630  Progress: 6088 on 8630  Progress: 6089 on 8630  Progress: 6090 on 8630  Progress: 6091 on 8630  Progress: 6092 on 8630  Progress: 6093 on 8630  Progress: 6094 on 8630  Progress: 6095 on 8630  Progress: 6096 on 8630  Progress: 6097 on 8630  Progress: 6098 on 8630  Progress: 6099 on 8630  Progress: 6100 on 8630  Progress: 6101 on 8630  Progress: 6102 on 8630  Progress: 6103 on 8630  Progress: 6104 on 8630  Progress: 6105 on 8630  Progress: 6106 on 8630  Progress: 6107 on 8630  Progress: 6108 on 8630  Progress: 6109 on 8630  Progress: 6110 on 8630  Progress: 6111 on 8630  Progress: 6112 on 8630  Progress: 6113 on 8630  Progress: 6114 on 8630  Progress: 6115 on 8630  Progress: 6116 on 8630  Progress: 6117 on 8630  Progress: 6118 on 8630  Progress: 6119 on 8630  Progress: 6120 on 8630  Progress: 6121 on 8630  Progress: 6122 on 8630  Progress: 6123 on 8630  Progress: 6124 on 8630  Progress: 6125 on 8630  Progress: 6126 on 8630  Progress: 6127 on 8630  Progress: 6128 on 8630  Progress: 6129 on 8630  Progress: 6130 on 8630  Progress: 6131 on 8630  Progress: 6132 on 8630  Progress: 6133 on 8630  Progress: 6134 on 8630  Progress: 6135 on 8630  Progress: 6136 on 8630  Progress: 6137 on 8630  Progress: 6138 on 8630  Progress: 6139 on 8630  Progress: 6140 on 8630  Progress: 6141 on 8630  Progress: 6142 on 8630  Progress: 6143 on 8630  Progress: 6144 on 8630  Progress: 6145 on 8630  Progress: 6146 on 8630  Progress: 6147 on 8630  Progress: 6148 on 8630  Progress: 6149 on 8630  Progress: 6150 on 8630  Progress: 6151 on 8630  Progress: 6152 on 8630  Progress: 6153 on 8630  Progress: 6154 on 8630  Progress: 6155 on 8630  Progress: 6156 on 8630  Progress: 6157 on 8630  Progress: 6158 on 8630  Progress: 6159 on 8630  Progress: 6160 on 8630  Progress: 6161 on 8630  Progress: 6162 on 8630  Progress: 6163 on 8630  Progress: 6164 on 8630  Progress: 6165 on 8630  Progress: 6166 on 8630  Progress: 6167 on 8630  Progress: 6168 on 8630  Progress: 6169 on 8630  Progress: 6170 on 8630  Progress: 6171 on 8630  Progress: 6172 on 8630  Progress: 6173 on 8630  Progress: 6174 on 8630  Progress: 6175 on 8630  Progress: 6176 on 8630  Progress: 6177 on 8630  Progress: 6178 on 8630  Progress: 6179 on 8630  Progress: 6180 on 8630  Progress: 6181 on 8630  Progress: 6182 on 8630  Progress: 6183 on 8630  Progress: 6184 on 8630  Progress: 6185 on 8630  Progress: 6186 on 8630  Progress: 6187 on 8630  Progress: 6188 on 8630  Progress: 6189 on 8630  Progress: 6190 on 8630  Progress: 6191 on 8630  Progress: 6192 on 8630  Progress: 6193 on 8630  Progress: 6194 on 8630  Progress: 6195 on 8630  Progress: 6196 on 8630  Progress: 6197 on 8630  Progress: 6198 on 8630  Progress: 6199 on 8630  Progress: 6200 on 8630  Progress: 6201 on 8630  Progress: 6202 on 8630  Progress: 6203 on 8630  Progress: 6204 on 8630  Progress: 6205 on 8630  Progress: 6206 on 8630  Progress: 6207 on 8630  Progress: 6208 on 8630  Progress: 6209 on 8630  Progress: 6210 on 8630  Progress: 6211 on 8630  Progress: 6212 on 8630  Progress: 6213 on 8630  Progress: 6214 on 8630  Progress: 6215 on 8630  Progress: 6216 on 8630  Progress: 6217 on 8630  Progress: 6218 on 8630  Progress: 6219 on 8630  Progress: 6220 on 8630  Progress: 6221 on 8630  Progress: 6222 on 8630  Progress: 6223 on 8630  Progress: 6224 on 8630  Progress: 6225 on 8630  Progress: 6226 on 8630  Progress: 6227 on 8630  Progress: 6228 on 8630  Progress: 6229 on 8630  Progress: 6230 on 8630  Progress: 6231 on 8630  Progress: 6232 on 8630  Progress: 6233 on 8630  Progress: 6234 on 8630  Progress: 6235 on 8630  Progress: 6236 on 8630  Progress: 6237 on 8630  Progress: 6238 on 8630  Progress: 6239 on 8630  Progress: 6240 on 8630  Progress: 6241 on 8630  Progress: 6242 on 8630  Progress: 6243 on 8630  Progress: 6244 on 8630  Progress: 6245 on 8630  Progress: 6246 on 8630  Progress: 6247 on 8630  Progress: 6248 on 8630  Progress: 6249 on 8630  Progress: 6250 on 8630  Progress: 6251 on 8630  Progress: 6252 on 8630  Progress: 6253 on 8630  Progress: 6254 on 8630  Progress: 6255 on 8630  Progress: 6256 on 8630  Progress: 6257 on 8630  Progress: 6258 on 8630  Progress: 6259 on 8630  Progress: 6260 on 8630  Progress: 6261 on 8630  Progress: 6262 on 8630  Progress: 6263 on 8630  Progress: 6264 on 8630  Progress: 6265 on 8630  Progress: 6266 on 8630  Progress: 6267 on 8630  Progress: 6268 on 8630  Progress: 6269 on 8630  Progress: 6270 on 8630  Progress: 6271 on 8630  Progress: 6272 on 8630  Progress: 6273 on 8630  Progress: 6274 on 8630  Progress: 6275 on 8630  Progress: 6276 on 8630  Progress: 6277 on 8630  Progress: 6278 on 8630  Progress: 6279 on 8630  Progress: 6280 on 8630  Progress: 6281 on 8630  Progress: 6282 on 8630  Progress: 6283 on 8630  Progress: 6284 on 8630  Progress: 6285 on 8630  Progress: 6286 on 8630  Progress: 6287 on 8630  Progress: 6288 on 8630  Progress: 6289 on 8630  Progress: 6290 on 8630  Progress: 6291 on 8630  Progress: 6292 on 8630  Progress: 6293 on 8630  Progress: 6294 on 8630  Progress: 6295 on 8630  Progress: 6296 on 8630  Progress: 6297 on 8630  Progress: 6298 on 8630  Progress: 6299 on 8630  Progress: 6300 on 8630  Progress: 6301 on 8630  Progress: 6302 on 8630  Progress: 6303 on 8630  Progress: 6304 on 8630  Progress: 6305 on 8630  Progress: 6306 on 8630  Progress: 6307 on 8630  Progress: 6308 on 8630  Progress: 6309 on 8630  Progress: 6310 on 8630  Progress: 6311 on 8630  Progress: 6312 on 8630  Progress: 6313 on 8630  Progress: 6314 on 8630  Progress: 6315 on 8630  Progress: 6316 on 8630  Progress: 6317 on 8630  Progress: 6318 on 8630  Progress: 6319 on 8630  Progress: 6320 on 8630  Progress: 6321 on 8630  Progress: 6322 on 8630  Progress: 6323 on 8630  Progress: 6324 on 8630  Progress: 6325 on 8630  Progress: 6326 on 8630  Progress: 6327 on 8630  Progress: 6328 on 8630  Progress: 6329 on 8630  Progress: 6330 on 8630  Progress: 6331 on 8630  Progress: 6332 on 8630  Progress: 6333 on 8630  Progress: 6334 on 8630  Progress: 6335 on 8630  Progress: 6336 on 8630  Progress: 6337 on 8630  Progress: 6338 on 8630  Progress: 6339 on 8630  Progress: 6340 on 8630  Progress: 6341 on 8630  Progress: 6342 on 8630  Progress: 6343 on 8630  Progress: 6344 on 8630  Progress: 6345 on 8630  Progress: 6346 on 8630  Progress: 6347 on 8630  Progress: 6348 on 8630  Progress: 6349 on 8630  Progress: 6350 on 8630  Progress: 6351 on 8630  Progress: 6352 on 8630  Progress: 6353 on 8630  Progress: 6354 on 8630  Progress: 6355 on 8630  Progress: 6356 on 8630  Progress: 6357 on 8630  Progress: 6358 on 8630  Progress: 6359 on 8630  Progress: 6360 on 8630  Progress: 6361 on 8630  Progress: 6362 on 8630  Progress: 6363 on 8630  Progress: 6364 on 8630  Progress: 6365 on 8630  Progress: 6366 on 8630  Progress: 6367 on 8630  Progress: 6368 on 8630  Progress: 6369 on 8630  Progress: 6370 on 8630  Progress: 6371 on 8630  Progress: 6372 on 8630  Progress: 6373 on 8630  Progress: 6374 on 8630  Progress: 6375 on 8630  Progress: 6376 on 8630  Progress: 6377 on 8630  Progress: 6378 on 8630  Progress: 6379 on 8630  Progress: 6380 on 8630  Progress: 6381 on 8630  Progress: 6382 on 8630  Progress: 6383 on 8630  Progress: 6384 on 8630  Progress: 6385 on 8630  Progress: 6386 on 8630  Progress: 6387 on 8630  Progress: 6388 on 8630  Progress: 6389 on 8630  Progress: 6390 on 8630  Progress: 6391 on 8630  Progress: 6392 on 8630  Progress: 6393 on 8630  Progress: 6394 on 8630  Progress: 6395 on 8630  Progress: 6396 on 8630  Progress: 6397 on 8630  Progress: 6398 on 8630  Progress: 6399 on 8630  Progress: 6400 on 8630  Progress: 6401 on 8630  Progress: 6402 on 8630  Progress: 6403 on 8630  Progress: 6404 on 8630  Progress: 6405 on 8630  Progress: 6406 on 8630  Progress: 6407 on 8630  Progress: 6408 on 8630  Progress: 6409 on 8630  Progress: 6410 on 8630  Progress: 6411 on 8630  Progress: 6412 on 8630  Progress: 6413 on 8630  Progress: 6414 on 8630  Progress: 6415 on 8630  Progress: 6416 on 8630  Progress: 6417 on 8630  Progress: 6418 on 8630  Progress: 6419 on 8630  Progress: 6420 on 8630  Progress: 6421 on 8630  Progress: 6422 on 8630  Progress: 6423 on 8630  Progress: 6424 on 8630  Progress: 6425 on 8630  Progress: 6426 on 8630  Progress: 6427 on 8630  Progress: 6428 on 8630  Progress: 6429 on 8630  Progress: 6430 on 8630  Progress: 6431 on 8630  Progress: 6432 on 8630  Progress: 6433 on 8630  Progress: 6434 on 8630  Progress: 6435 on 8630  Progress: 6436 on 8630  Progress: 6437 on 8630  Progress: 6438 on 8630  Progress: 6439 on 8630  Progress: 6440 on 8630  Progress: 6441 on 8630  Progress: 6442 on 8630  Progress: 6443 on 8630  Progress: 6444 on 8630  Progress: 6445 on 8630  Progress: 6446 on 8630  Progress: 6447 on 8630  Progress: 6448 on 8630  Progress: 6449 on 8630  Progress: 6450 on 8630  Progress: 6451 on 8630  Progress: 6452 on 8630  Progress: 6453 on 8630  Progress: 6454 on 8630  Progress: 6455 on 8630  Progress: 6456 on 8630  Progress: 6457 on 8630  Progress: 6458 on 8630  Progress: 6459 on 8630  Progress: 6460 on 8630  Progress: 6461 on 8630  Progress: 6462 on 8630  Progress: 6463 on 8630  Progress: 6464 on 8630  Progress: 6465 on 8630  Progress: 6466 on 8630  Progress: 6467 on 8630  Progress: 6468 on 8630  Progress: 6469 on 8630  Progress: 6470 on 8630  Progress: 6471 on 8630  Progress: 6472 on 8630  Progress: 6473 on 8630  Progress: 6474 on 8630  Progress: 6475 on 8630  Progress: 6476 on 8630  Progress: 6477 on 8630  Progress: 6478 on 8630  Progress: 6479 on 8630  Progress: 6480 on 8630  Progress: 6481 on 8630  Progress: 6482 on 8630  Progress: 6483 on 8630  Progress: 6484 on 8630  Progress: 6485 on 8630  Progress: 6486 on 8630  Progress: 6487 on 8630  Progress: 6488 on 8630  Progress: 6489 on 8630  Progress: 6490 on 8630  Progress: 6491 on 8630  Progress: 6492 on 8630  Progress: 6493 on 8630  Progress: 6494 on 8630  Progress: 6495 on 8630  Progress: 6496 on 8630  Progress: 6497 on 8630  Progress: 6498 on 8630  Progress: 6499 on 8630  Progress: 6500 on 8630  Progress: 6501 on 8630  Progress: 6502 on 8630  Progress: 6503 on 8630  Progress: 6504 on 8630  Progress: 6505 on 8630  Progress: 6506 on 8630  Progress: 6507 on 8630  Progress: 6508 on 8630  Progress: 6509 on 8630  Progress: 6510 on 8630  Progress: 6511 on 8630  Progress: 6512 on 8630  Progress: 6513 on 8630  Progress: 6514 on 8630  Progress: 6515 on 8630  Progress: 6516 on 8630  Progress: 6517 on 8630  Progress: 6518 on 8630  Progress: 6519 on 8630  Progress: 6520 on 8630  Progress: 6521 on 8630  Progress: 6522 on 8630  Progress: 6523 on 8630  Progress: 6524 on 8630  Progress: 6525 on 8630  Progress: 6526 on 8630  Progress: 6527 on 8630  Progress: 6528 on 8630  Progress: 6529 on 8630  Progress: 6530 on 8630  Progress: 6531 on 8630  Progress: 6532 on 8630  Progress: 6533 on 8630  Progress: 6534 on 8630  Progress: 6535 on 8630  Progress: 6536 on 8630  Progress: 6537 on 8630  Progress: 6538 on 8630  Progress: 6539 on 8630  Progress: 6540 on 8630  Progress: 6541 on 8630  Progress: 6542 on 8630  Progress: 6543 on 8630  Progress: 6544 on 8630  Progress: 6545 on 8630  Progress: 6546 on 8630  Progress: 6547 on 8630  Progress: 6548 on 8630  Progress: 6549 on 8630  Progress: 6550 on 8630  Progress: 6551 on 8630  Progress: 6552 on 8630  Progress: 6553 on 8630  Progress: 6554 on 8630  Progress: 6555 on 8630  Progress: 6556 on 8630  Progress: 6557 on 8630  Progress: 6558 on 8630  Progress: 6559 on 8630  Progress: 6560 on 8630  Progress: 6561 on 8630  Progress: 6562 on 8630  Progress: 6563 on 8630  Progress: 6564 on 8630  Progress: 6565 on 8630  Progress: 6566 on 8630  Progress: 6567 on 8630  Progress: 6568 on 8630  Progress: 6569 on 8630  Progress: 6570 on 8630  Progress: 6571 on 8630  Progress: 6572 on 8630  Progress: 6573 on 8630  Progress: 6574 on 8630  Progress: 6575 on 8630  Progress: 6576 on 8630  Progress: 6577 on 8630  Progress: 6578 on 8630  Progress: 6579 on 8630  Progress: 6580 on 8630  Progress: 6581 on 8630  Progress: 6582 on 8630  Progress: 6583 on 8630  Progress: 6584 on 8630  Progress: 6585 on 8630  Progress: 6586 on 8630  Progress: 6587 on 8630  Progress: 6588 on 8630  Progress: 6589 on 8630  Progress: 6590 on 8630  Progress: 6591 on 8630  Progress: 6592 on 8630  Progress: 6593 on 8630  Progress: 6594 on 8630  Progress: 6595 on 8630  Progress: 6596 on 8630  Progress: 6597 on 8630  Progress: 6598 on 8630  Progress: 6599 on 8630  Progress: 6600 on 8630  Progress: 6601 on 8630  Progress: 6602 on 8630  Progress: 6603 on 8630  Progress: 6604 on 8630  Progress: 6605 on 8630  Progress: 6606 on 8630  Progress: 6607 on 8630  Progress: 6608 on 8630  Progress: 6609 on 8630  Progress: 6610 on 8630  Progress: 6611 on 8630  Progress: 6612 on 8630  Progress: 6613 on 8630  Progress: 6614 on 8630  Progress: 6615 on 8630  Progress: 6616 on 8630  Progress: 6617 on 8630  Progress: 6618 on 8630  Progress: 6619 on 8630  Progress: 6620 on 8630  Progress: 6621 on 8630  Progress: 6622 on 8630  Progress: 6623 on 8630  Progress: 6624 on 8630  Progress: 6625 on 8630  Progress: 6626 on 8630  Progress: 6627 on 8630  Progress: 6628 on 8630  Progress: 6629 on 8630  Progress: 6630 on 8630  Progress: 6631 on 8630  Progress: 6632 on 8630  Progress: 6633 on 8630  Progress: 6634 on 8630  Progress: 6635 on 8630  Progress: 6636 on 8630  Progress: 6637 on 8630  Progress: 6638 on 8630  Progress: 6639 on 8630  Progress: 6640 on 8630  Progress: 6641 on 8630  Progress: 6642 on 8630  Progress: 6643 on 8630  Progress: 6644 on 8630  Progress: 6645 on 8630  Progress: 6646 on 8630  Progress: 6647 on 8630  Progress: 6648 on 8630  Progress: 6649 on 8630  Progress: 6650 on 8630  Progress: 6651 on 8630  Progress: 6652 on 8630  Progress: 6653 on 8630  Progress: 6654 on 8630  Progress: 6655 on 8630  Progress: 6656 on 8630  Progress: 6657 on 8630  Progress: 6658 on 8630  Progress: 6659 on 8630  Progress: 6660 on 8630  Progress: 6661 on 8630  Progress: 6662 on 8630  Progress: 6663 on 8630  Progress: 6664 on 8630  Progress: 6665 on 8630  Progress: 6666 on 8630  Progress: 6667 on 8630  Progress: 6668 on 8630  Progress: 6669 on 8630  Progress: 6670 on 8630  Progress: 6671 on 8630  Progress: 6672 on 8630  Progress: 6673 on 8630  Progress: 6674 on 8630  Progress: 6675 on 8630  Progress: 6676 on 8630  Progress: 6677 on 8630  Progress: 6678 on 8630  Progress: 6679 on 8630  Progress: 6680 on 8630  Progress: 6681 on 8630  Progress: 6682 on 8630  Progress: 6683 on 8630  Progress: 6684 on 8630  Progress: 6685 on 8630  Progress: 6686 on 8630  Progress: 6687 on 8630  Progress: 6688 on 8630  Progress: 6689 on 8630  Progress: 6690 on 8630  Progress: 6691 on 8630  Progress: 6692 on 8630  Progress: 6693 on 8630  Progress: 6694 on 8630  Progress: 6695 on 8630  Progress: 6696 on 8630  Progress: 6697 on 8630  Progress: 6698 on 8630  Progress: 6699 on 8630  Progress: 6700 on 8630  Progress: 6701 on 8630  Progress: 6702 on 8630  Progress: 6703 on 8630  Progress: 6704 on 8630  Progress: 6705 on 8630  Progress: 6706 on 8630  Progress: 6707 on 8630  Progress: 6708 on 8630  Progress: 6709 on 8630  Progress: 6710 on 8630  Progress: 6711 on 8630  Progress: 6712 on 8630  Progress: 6713 on 8630  Progress: 6714 on 8630  Progress: 6715 on 8630  Progress: 6716 on 8630  Progress: 6717 on 8630  Progress: 6718 on 8630  Progress: 6719 on 8630  Progress: 6720 on 8630  Progress: 6721 on 8630  Progress: 6722 on 8630  Progress: 6723 on 8630  Progress: 6724 on 8630  Progress: 6725 on 8630  Progress: 6726 on 8630  Progress: 6727 on 8630  Progress: 6728 on 8630  Progress: 6729 on 8630  Progress: 6730 on 8630  Progress: 6731 on 8630  Progress: 6732 on 8630  Progress: 6733 on 8630  Progress: 6734 on 8630  Progress: 6735 on 8630  Progress: 6736 on 8630  Progress: 6737 on 8630  Progress: 6738 on 8630  Progress: 6739 on 8630  Progress: 6740 on 8630  Progress: 6741 on 8630  Progress: 6742 on 8630  Progress: 6743 on 8630  Progress: 6744 on 8630  Progress: 6745 on 8630  Progress: 6746 on 8630  Progress: 6747 on 8630  Progress: 6748 on 8630  Progress: 6749 on 8630  Progress: 6750 on 8630  Progress: 6751 on 8630  Progress: 6752 on 8630  Progress: 6753 on 8630  Progress: 6754 on 8630  Progress: 6755 on 8630  Progress: 6756 on 8630  Progress: 6757 on 8630  Progress: 6758 on 8630  Progress: 6759 on 8630  Progress: 6760 on 8630  Progress: 6761 on 8630  Progress: 6762 on 8630  Progress: 6763 on 8630  Progress: 6764 on 8630  Progress: 6765 on 8630  Progress: 6766 on 8630  Progress: 6767 on 8630  Progress: 6768 on 8630  Progress: 6769 on 8630  Progress: 6770 on 8630  Progress: 6771 on 8630  Progress: 6772 on 8630  Progress: 6773 on 8630  Progress: 6774 on 8630  Progress: 6775 on 8630  Progress: 6776 on 8630  Progress: 6777 on 8630  Progress: 6778 on 8630  Progress: 6779 on 8630  Progress: 6780 on 8630  Progress: 6781 on 8630  Progress: 6782 on 8630  Progress: 6783 on 8630  Progress: 6784 on 8630  Progress: 6785 on 8630  Progress: 6786 on 8630  Progress: 6787 on 8630  Progress: 6788 on 8630  Progress: 6789 on 8630  Progress: 6790 on 8630  Progress: 6791 on 8630  Progress: 6792 on 8630  Progress: 6793 on 8630  Progress: 6794 on 8630  Progress: 6795 on 8630  Progress: 6796 on 8630  Progress: 6797 on 8630  Progress: 6798 on 8630  Progress: 6799 on 8630  Progress: 6800 on 8630  Progress: 6801 on 8630  Progress: 6802 on 8630  Progress: 6803 on 8630  Progress: 6804 on 8630  Progress: 6805 on 8630  Progress: 6806 on 8630  Progress: 6807 on 8630  Progress: 6808 on 8630  Progress: 6809 on 8630  Progress: 6810 on 8630  Progress: 6811 on 8630  Progress: 6812 on 8630  Progress: 6813 on 8630  Progress: 6814 on 8630  Progress: 6815 on 8630  Progress: 6816 on 8630  Progress: 6817 on 8630  Progress: 6818 on 8630  Progress: 6819 on 8630  Progress: 6820 on 8630  Progress: 6821 on 8630  Progress: 6822 on 8630  Progress: 6823 on 8630  Progress: 6824 on 8630  Progress: 6825 on 8630  Progress: 6826 on 8630  Progress: 6827 on 8630  Progress: 6828 on 8630  Progress: 6829 on 8630  Progress: 6830 on 8630  Progress: 6831 on 8630  Progress: 6832 on 8630  Progress: 6833 on 8630  Progress: 6834 on 8630  Progress: 6835 on 8630  Progress: 6836 on 8630  Progress: 6837 on 8630  Progress: 6838 on 8630  Progress: 6839 on 8630  Progress: 6840 on 8630  Progress: 6841 on 8630  Progress: 6842 on 8630  Progress: 6843 on 8630  Progress: 6844 on 8630  Progress: 6845 on 8630  Progress: 6846 on 8630  Progress: 6847 on 8630  Progress: 6848 on 8630  Progress: 6849 on 8630  Progress: 6850 on 8630  Progress: 6851 on 8630  Progress: 6852 on 8630  Progress: 6853 on 8630  Progress: 6854 on 8630  Progress: 6855 on 8630  Progress: 6856 on 8630  Progress: 6857 on 8630  Progress: 6858 on 8630  Progress: 6859 on 8630  Progress: 6860 on 8630  Progress: 6861 on 8630  Progress: 6862 on 8630  Progress: 6863 on 8630  Progress: 6864 on 8630  Progress: 6865 on 8630  Progress: 6866 on 8630  Progress: 6867 on 8630  Progress: 6868 on 8630  Progress: 6869 on 8630  Progress: 6870 on 8630  Progress: 6871 on 8630  Progress: 6872 on 8630  Progress: 6873 on 8630  Progress: 6874 on 8630  Progress: 6875 on 8630  Progress: 6876 on 8630  Progress: 6877 on 8630  Progress: 6878 on 8630  Progress: 6879 on 8630  Progress: 6880 on 8630  Progress: 6881 on 8630  Progress: 6882 on 8630  Progress: 6883 on 8630  Progress: 6884 on 8630  Progress: 6885 on 8630  Progress: 6886 on 8630  Progress: 6887 on 8630  Progress: 6888 on 8630  Progress: 6889 on 8630  Progress: 6890 on 8630  Progress: 6891 on 8630  Progress: 6892 on 8630  Progress: 6893 on 8630  Progress: 6894 on 8630  Progress: 6895 on 8630  Progress: 6896 on 8630  Progress: 6897 on 8630  Progress: 6898 on 8630  Progress: 6899 on 8630  Progress: 6900 on 8630  Progress: 6901 on 8630  Progress: 6902 on 8630  Progress: 6903 on 8630  Progress: 6904 on 8630  Progress: 6905 on 8630  Progress: 6906 on 8630  Progress: 6907 on 8630  Progress: 6908 on 8630  Progress: 6909 on 8630  Progress: 6910 on 8630  Progress: 6911 on 8630  Progress: 6912 on 8630  Progress: 6913 on 8630  Progress: 6914 on 8630  Progress: 6915 on 8630  Progress: 6916 on 8630  Progress: 6917 on 8630  Progress: 6918 on 8630  Progress: 6919 on 8630  Progress: 6920 on 8630  Progress: 6921 on 8630  Progress: 6922 on 8630  Progress: 6923 on 8630  Progress: 6924 on 8630  Progress: 6925 on 8630  Progress: 6926 on 8630  Progress: 6927 on 8630  Progress: 6928 on 8630  Progress: 6929 on 8630  Progress: 6930 on 8630  Progress: 6931 on 8630  Progress: 6932 on 8630  Progress: 6933 on 8630  Progress: 6934 on 8630  Progress: 6935 on 8630  Progress: 6936 on 8630  Progress: 6937 on 8630  Progress: 6938 on 8630  Progress: 6939 on 8630  Progress: 6940 on 8630  Progress: 6941 on 8630  Progress: 6942 on 8630  Progress: 6943 on 8630  Progress: 6944 on 8630  Progress: 6945 on 8630  Progress: 6946 on 8630  Progress: 6947 on 8630  Progress: 6948 on 8630  Progress: 6949 on 8630  Progress: 6950 on 8630  Progress: 6951 on 8630  Progress: 6952 on 8630  Progress: 6953 on 8630  Progress: 6954 on 8630  Progress: 6955 on 8630  Progress: 6956 on 8630  Progress: 6957 on 8630  Progress: 6958 on 8630  Progress: 6959 on 8630  Progress: 6960 on 8630  Progress: 6961 on 8630  Progress: 6962 on 8630  Progress: 6963 on 8630  Progress: 6964 on 8630  Progress: 6965 on 8630  Progress: 6966 on 8630  Progress: 6967 on 8630  Progress: 6968 on 8630  Progress: 6969 on 8630  Progress: 6970 on 8630  Progress: 6971 on 8630  Progress: 6972 on 8630  Progress: 6973 on 8630  Progress: 6974 on 8630  Progress: 6975 on 8630  Progress: 6976 on 8630  Progress: 6977 on 8630  Progress: 6978 on 8630  Progress: 6979 on 8630  Progress: 6980 on 8630  Progress: 6981 on 8630  Progress: 6982 on 8630  Progress: 6983 on 8630  Progress: 6984 on 8630  Progress: 6985 on 8630  Progress: 6986 on 8630  Progress: 6987 on 8630  Progress: 6988 on 8630  Progress: 6989 on 8630  Progress: 6990 on 8630  Progress: 6991 on 8630  Progress: 6992 on 8630  Progress: 6993 on 8630  Progress: 6994 on 8630  Progress: 6995 on 8630  Progress: 6996 on 8630  Progress: 6997 on 8630  Progress: 6998 on 8630  Progress: 6999 on 8630  Progress: 7000 on 8630  Progress: 7001 on 8630  Progress: 7002 on 8630  Progress: 7003 on 8630  Progress: 7004 on 8630  Progress: 7005 on 8630  Progress: 7006 on 8630  Progress: 7007 on 8630  Progress: 7008 on 8630  Progress: 7009 on 8630  Progress: 7010 on 8630  Progress: 7011 on 8630  Progress: 7012 on 8630  Progress: 7013 on 8630  Progress: 7014 on 8630  Progress: 7015 on 8630  Progress: 7016 on 8630  Progress: 7017 on 8630  Progress: 7018 on 8630  Progress: 7019 on 8630  Progress: 7020 on 8630  Progress: 7021 on 8630  Progress: 7022 on 8630  Progress: 7023 on 8630  Progress: 7024 on 8630  Progress: 7025 on 8630  Progress: 7026 on 8630  Progress: 7027 on 8630  Progress: 7028 on 8630  Progress: 7029 on 8630  Progress: 7030 on 8630  Progress: 7031 on 8630  Progress: 7032 on 8630  Progress: 7033 on 8630  Progress: 7034 on 8630  Progress: 7035 on 8630  Progress: 7036 on 8630  Progress: 7037 on 8630  Progress: 7038 on 8630  Progress: 7039 on 8630  Progress: 7040 on 8630  Progress: 7041 on 8630  Progress: 7042 on 8630  Progress: 7043 on 8630  Progress: 7044 on 8630  Progress: 7045 on 8630  Progress: 7046 on 8630  Progress: 7047 on 8630  Progress: 7048 on 8630  Progress: 7049 on 8630  Progress: 7050 on 8630  Progress: 7051 on 8630  Progress: 7052 on 8630  Progress: 7053 on 8630  Progress: 7054 on 8630  Progress: 7055 on 8630  Progress: 7056 on 8630  Progress: 7057 on 8630  Progress: 7058 on 8630  Progress: 7059 on 8630  Progress: 7060 on 8630  Progress: 7061 on 8630  Progress: 7062 on 8630  Progress: 7063 on 8630  Progress: 7064 on 8630  Progress: 7065 on 8630  Progress: 7066 on 8630  Progress: 7067 on 8630  Progress: 7068 on 8630  Progress: 7069 on 8630  Progress: 7070 on 8630  Progress: 7071 on 8630  Progress: 7072 on 8630  Progress: 7073 on 8630  Progress: 7074 on 8630  Progress: 7075 on 8630  Progress: 7076 on 8630  Progress: 7077 on 8630  Progress: 7078 on 8630  Progress: 7079 on 8630  Progress: 7080 on 8630  Progress: 7081 on 8630  Progress: 7082 on 8630  Progress: 7083 on 8630  Progress: 7084 on 8630  Progress: 7085 on 8630  Progress: 7086 on 8630  Progress: 7087 on 8630  Progress: 7088 on 8630  Progress: 7089 on 8630  Progress: 7090 on 8630  Progress: 7091 on 8630  Progress: 7092 on 8630  Progress: 7093 on 8630  Progress: 7094 on 8630  Progress: 7095 on 8630  Progress: 7096 on 8630  Progress: 7097 on 8630  Progress: 7098 on 8630  Progress: 7099 on 8630  Progress: 7100 on 8630  Progress: 7101 on 8630  Progress: 7102 on 8630  Progress: 7103 on 8630  Progress: 7104 on 8630  Progress: 7105 on 8630  Progress: 7106 on 8630  Progress: 7107 on 8630  Progress: 7108 on 8630  Progress: 7109 on 8630  Progress: 7110 on 8630  Progress: 7111 on 8630  Progress: 7112 on 8630  Progress: 7113 on 8630  Progress: 7114 on 8630  Progress: 7115 on 8630  Progress: 7116 on 8630  Progress: 7117 on 8630  Progress: 7118 on 8630  Progress: 7119 on 8630  Progress: 7120 on 8630  Progress: 7121 on 8630  Progress: 7122 on 8630  Progress: 7123 on 8630  Progress: 7124 on 8630  Progress: 7125 on 8630  Progress: 7126 on 8630  Progress: 7127 on 8630  Progress: 7128 on 8630  Progress: 7129 on 8630  Progress: 7130 on 8630  Progress: 7131 on 8630  Progress: 7132 on 8630  Progress: 7133 on 8630  Progress: 7134 on 8630  Progress: 7135 on 8630  Progress: 7136 on 8630  Progress: 7137 on 8630  Progress: 7138 on 8630  Progress: 7139 on 8630  Progress: 7140 on 8630  Progress: 7141 on 8630  Progress: 7142 on 8630  Progress: 7143 on 8630  Progress: 7144 on 8630  Progress: 7145 on 8630  Progress: 7146 on 8630  Progress: 7147 on 8630  Progress: 7148 on 8630  Progress: 7149 on 8630  Progress: 7150 on 8630  Progress: 7151 on 8630  Progress: 7152 on 8630  Progress: 7153 on 8630  Progress: 7154 on 8630  Progress: 7155 on 8630  Progress: 7156 on 8630  Progress: 7157 on 8630  Progress: 7158 on 8630  Progress: 7159 on 8630  Progress: 7160 on 8630  Progress: 7161 on 8630  Progress: 7162 on 8630  Progress: 7163 on 8630  Progress: 7164 on 8630  Progress: 7165 on 8630  Progress: 7166 on 8630  Progress: 7167 on 8630  Progress: 7168 on 8630  Progress: 7169 on 8630  Progress: 7170 on 8630  Progress: 7171 on 8630  Progress: 7172 on 8630  Progress: 7173 on 8630  Progress: 7174 on 8630  Progress: 7175 on 8630  Progress: 7176 on 8630  Progress: 7177 on 8630  Progress: 7178 on 8630  Progress: 7179 on 8630  Progress: 7180 on 8630  Progress: 7181 on 8630  Progress: 7182 on 8630  Progress: 7183 on 8630  Progress: 7184 on 8630  Progress: 7185 on 8630  Progress: 7186 on 8630  Progress: 7187 on 8630  Progress: 7188 on 8630  Progress: 7189 on 8630  Progress: 7190 on 8630  Progress: 7191 on 8630  Progress: 7192 on 8630  Progress: 7193 on 8630  Progress: 7194 on 8630  Progress: 7195 on 8630  Progress: 7196 on 8630  Progress: 7197 on 8630  Progress: 7198 on 8630  Progress: 7199 on 8630  Progress: 7200 on 8630  Progress: 7201 on 8630  Progress: 7202 on 8630  Progress: 7203 on 8630  Progress: 7204 on 8630  Progress: 7205 on 8630  Progress: 7206 on 8630  Progress: 7207 on 8630  Progress: 7208 on 8630  Progress: 7209 on 8630  Progress: 7210 on 8630  Progress: 7211 on 8630  Progress: 7212 on 8630  Progress: 7213 on 8630  Progress: 7214 on 8630  Progress: 7215 on 8630  Progress: 7216 on 8630  Progress: 7217 on 8630  Progress: 7218 on 8630  Progress: 7219 on 8630  Progress: 7220 on 8630  Progress: 7221 on 8630  Progress: 7222 on 8630  Progress: 7223 on 8630  Progress: 7224 on 8630  Progress: 7225 on 8630  Progress: 7226 on 8630  Progress: 7227 on 8630  Progress: 7228 on 8630  Progress: 7229 on 8630  Progress: 7230 on 8630  Progress: 7231 on 8630  Progress: 7232 on 8630  Progress: 7233 on 8630  Progress: 7234 on 8630  Progress: 7235 on 8630  Progress: 7236 on 8630  Progress: 7237 on 8630  Progress: 7238 on 8630  Progress: 7239 on 8630  Progress: 7240 on 8630  Progress: 7241 on 8630  Progress: 7242 on 8630  Progress: 7243 on 8630  Progress: 7244 on 8630  Progress: 7245 on 8630  Progress: 7246 on 8630  Progress: 7247 on 8630  Progress: 7248 on 8630  Progress: 7249 on 8630  Progress: 7250 on 8630  Progress: 7251 on 8630  Progress: 7252 on 8630  Progress: 7253 on 8630  Progress: 7254 on 8630  Progress: 7255 on 8630  Progress: 7256 on 8630  Progress: 7257 on 8630  Progress: 7258 on 8630  Progress: 7259 on 8630  Progress: 7260 on 8630  Progress: 7261 on 8630  Progress: 7262 on 8630  Progress: 7263 on 8630  Progress: 7264 on 8630  Progress: 7265 on 8630  Progress: 7266 on 8630  Progress: 7267 on 8630  Progress: 7268 on 8630  Progress: 7269 on 8630  Progress: 7270 on 8630  Progress: 7271 on 8630  Progress: 7272 on 8630  Progress: 7273 on 8630  Progress: 7274 on 8630  Progress: 7275 on 8630  Progress: 7276 on 8630  Progress: 7277 on 8630  Progress: 7278 on 8630  Progress: 7279 on 8630  Progress: 7280 on 8630  Progress: 7281 on 8630  Progress: 7282 on 8630  Progress: 7283 on 8630  Progress: 7284 on 8630  Progress: 7285 on 8630  Progress: 7286 on 8630  Progress: 7287 on 8630  Progress: 7288 on 8630  Progress: 7289 on 8630  Progress: 7290 on 8630  Progress: 7291 on 8630  Progress: 7292 on 8630  Progress: 7293 on 8630  Progress: 7294 on 8630  Progress: 7295 on 8630  Progress: 7296 on 8630  Progress: 7297 on 8630  Progress: 7298 on 8630  Progress: 7299 on 8630  Progress: 7300 on 8630  Progress: 7301 on 8630  Progress: 7302 on 8630  Progress: 7303 on 8630  Progress: 7304 on 8630  Progress: 7305 on 8630  Progress: 7306 on 8630  Progress: 7307 on 8630  Progress: 7308 on 8630  Progress: 7309 on 8630  Progress: 7310 on 8630  Progress: 7311 on 8630  Progress: 7312 on 8630  Progress: 7313 on 8630  Progress: 7314 on 8630  Progress: 7315 on 8630  Progress: 7316 on 8630  Progress: 7317 on 8630  Progress: 7318 on 8630  Progress: 7319 on 8630  Progress: 7320 on 8630  Progress: 7321 on 8630  Progress: 7322 on 8630  Progress: 7323 on 8630  Progress: 7324 on 8630  Progress: 7325 on 8630  Progress: 7326 on 8630  Progress: 7327 on 8630  Progress: 7328 on 8630  Progress: 7329 on 8630  Progress: 7330 on 8630  Progress: 7331 on 8630  Progress: 7332 on 8630  Progress: 7333 on 8630  Progress: 7334 on 8630  Progress: 7335 on 8630  Progress: 7336 on 8630  Progress: 7337 on 8630  Progress: 7338 on 8630  Progress: 7339 on 8630  Progress: 7340 on 8630  Progress: 7341 on 8630  Progress: 7342 on 8630  Progress: 7343 on 8630  Progress: 7344 on 8630  Progress: 7345 on 8630  Progress: 7346 on 8630  Progress: 7347 on 8630  Progress: 7348 on 8630  Progress: 7349 on 8630  Progress: 7350 on 8630  Progress: 7351 on 8630  Progress: 7352 on 8630  Progress: 7353 on 8630  Progress: 7354 on 8630  Progress: 7355 on 8630  Progress: 7356 on 8630  Progress: 7357 on 8630  Progress: 7358 on 8630  Progress: 7359 on 8630  Progress: 7360 on 8630  Progress: 7361 on 8630  Progress: 7362 on 8630  Progress: 7363 on 8630  Progress: 7364 on 8630  Progress: 7365 on 8630  Progress: 7366 on 8630  Progress: 7367 on 8630  Progress: 7368 on 8630  Progress: 7369 on 8630  Progress: 7370 on 8630  Progress: 7371 on 8630  Progress: 7372 on 8630  Progress: 7373 on 8630  Progress: 7374 on 8630  Progress: 7375 on 8630  Progress: 7376 on 8630  Progress: 7377 on 8630  Progress: 7378 on 8630  Progress: 7379 on 8630  Progress: 7380 on 8630  Progress: 7381 on 8630  Progress: 7382 on 8630  Progress: 7383 on 8630  Progress: 7384 on 8630  Progress: 7385 on 8630  Progress: 7386 on 8630  Progress: 7387 on 8630  Progress: 7388 on 8630  Progress: 7389 on 8630  Progress: 7390 on 8630  Progress: 7391 on 8630  Progress: 7392 on 8630  Progress: 7393 on 8630  Progress: 7394 on 8630  Progress: 7395 on 8630  Progress: 7396 on 8630  Progress: 7397 on 8630  Progress: 7398 on 8630  Progress: 7399 on 8630  Progress: 7400 on 8630  Progress: 7401 on 8630  Progress: 7402 on 8630  Progress: 7403 on 8630  Progress: 7404 on 8630  Progress: 7405 on 8630  Progress: 7406 on 8630  Progress: 7407 on 8630  Progress: 7408 on 8630  Progress: 7409 on 8630  Progress: 7410 on 8630  Progress: 7411 on 8630  Progress: 7412 on 8630  Progress: 7413 on 8630  Progress: 7414 on 8630  Progress: 7415 on 8630  Progress: 7416 on 8630  Progress: 7417 on 8630  Progress: 7418 on 8630  Progress: 7419 on 8630  Progress: 7420 on 8630  Progress: 7421 on 8630  Progress: 7422 on 8630  Progress: 7423 on 8630  Progress: 7424 on 8630  Progress: 7425 on 8630  Progress: 7426 on 8630  Progress: 7427 on 8630  Progress: 7428 on 8630  Progress: 7429 on 8630  Progress: 7430 on 8630  Progress: 7431 on 8630  Progress: 7432 on 8630  Progress: 7433 on 8630  Progress: 7434 on 8630  Progress: 7435 on 8630  Progress: 7436 on 8630  Progress: 7437 on 8630  Progress: 7438 on 8630  Progress: 7439 on 8630  Progress: 7440 on 8630  Progress: 7441 on 8630  Progress: 7442 on 8630  Progress: 7443 on 8630  Progress: 7444 on 8630  Progress: 7445 on 8630  Progress: 7446 on 8630  Progress: 7447 on 8630  Progress: 7448 on 8630  Progress: 7449 on 8630  Progress: 7450 on 8630  Progress: 7451 on 8630  Progress: 7452 on 8630  Progress: 7453 on 8630  Progress: 7454 on 8630  Progress: 7455 on 8630  Progress: 7456 on 8630  Progress: 7457 on 8630  Progress: 7458 on 8630  Progress: 7459 on 8630  Progress: 7460 on 8630  Progress: 7461 on 8630  Progress: 7462 on 8630  Progress: 7463 on 8630  Progress: 7464 on 8630  Progress: 7465 on 8630  Progress: 7466 on 8630  Progress: 7467 on 8630  Progress: 7468 on 8630  Progress: 7469 on 8630  Progress: 7470 on 8630  Progress: 7471 on 8630  Progress: 7472 on 8630  Progress: 7473 on 8630  Progress: 7474 on 8630  Progress: 7475 on 8630  Progress: 7476 on 8630  Progress: 7477 on 8630  Progress: 7478 on 8630  Progress: 7479 on 8630  Progress: 7480 on 8630  Progress: 7481 on 8630  Progress: 7482 on 8630  Progress: 7483 on 8630  Progress: 7484 on 8630  Progress: 7485 on 8630  Progress: 7486 on 8630  Progress: 7487 on 8630  Progress: 7488 on 8630  Progress: 7489 on 8630  Progress: 7490 on 8630  Progress: 7491 on 8630  Progress: 7492 on 8630  Progress: 7493 on 8630  Progress: 7494 on 8630  Progress: 7495 on 8630  Progress: 7496 on 8630  Progress: 7497 on 8630  Progress: 7498 on 8630  Progress: 7499 on 8630  Progress: 7500 on 8630  Progress: 7501 on 8630  Progress: 7502 on 8630  Progress: 7503 on 8630  Progress: 7504 on 8630  Progress: 7505 on 8630  Progress: 7506 on 8630  Progress: 7507 on 8630  Progress: 7508 on 8630  Progress: 7509 on 8630  Progress: 7510 on 8630  Progress: 7511 on 8630  Progress: 7512 on 8630  Progress: 7513 on 8630  Progress: 7514 on 8630  Progress: 7515 on 8630  Progress: 7516 on 8630  Progress: 7517 on 8630  Progress: 7518 on 8630  Progress: 7519 on 8630  Progress: 7520 on 8630  Progress: 7521 on 8630  Progress: 7522 on 8630  Progress: 7523 on 8630  Progress: 7524 on 8630  Progress: 7525 on 8630  Progress: 7526 on 8630  Progress: 7527 on 8630  Progress: 7528 on 8630  Progress: 7529 on 8630  Progress: 7530 on 8630  Progress: 7531 on 8630  Progress: 7532 on 8630  Progress: 7533 on 8630  Progress: 7534 on 8630  Progress: 7535 on 8630  Progress: 7536 on 8630  Progress: 7537 on 8630  Progress: 7538 on 8630  Progress: 7539 on 8630  Progress: 7540 on 8630  Progress: 7541 on 8630  Progress: 7542 on 8630  Progress: 7543 on 8630  Progress: 7544 on 8630  Progress: 7545 on 8630  Progress: 7546 on 8630  Progress: 7547 on 8630  Progress: 7548 on 8630  Progress: 7549 on 8630  Progress: 7550 on 8630  Progress: 7551 on 8630  Progress: 7552 on 8630  Progress: 7553 on 8630  Progress: 7554 on 8630  Progress: 7555 on 8630  Progress: 7556 on 8630  Progress: 7557 on 8630  Progress: 7558 on 8630  Progress: 7559 on 8630  Progress: 7560 on 8630  Progress: 7561 on 8630  Progress: 7562 on 8630  Progress: 7563 on 8630  Progress: 7564 on 8630  Progress: 7565 on 8630  Progress: 7566 on 8630  Progress: 7567 on 8630  Progress: 7568 on 8630  Progress: 7569 on 8630  Progress: 7570 on 8630  Progress: 7571 on 8630  Progress: 7572 on 8630  Progress: 7573 on 8630  Progress: 7574 on 8630  Progress: 7575 on 8630  Progress: 7576 on 8630  Progress: 7577 on 8630  Progress: 7578 on 8630  Progress: 7579 on 8630  Progress: 7580 on 8630  Progress: 7581 on 8630  Progress: 7582 on 8630  Progress: 7583 on 8630  Progress: 7584 on 8630  Progress: 7585 on 8630  Progress: 7586 on 8630  Progress: 7587 on 8630  Progress: 7588 on 8630  Progress: 7589 on 8630  Progress: 7590 on 8630  Progress: 7591 on 8630  Progress: 7592 on 8630  Progress: 7593 on 8630  Progress: 7594 on 8630  Progress: 7595 on 8630  Progress: 7596 on 8630  Progress: 7597 on 8630  Progress: 7598 on 8630  Progress: 7599 on 8630  Progress: 7600 on 8630  Progress: 7601 on 8630  Progress: 7602 on 8630  Progress: 7603 on 8630  Progress: 7604 on 8630  Progress: 7605 on 8630  Progress: 7606 on 8630  Progress: 7607 on 8630  Progress: 7608 on 8630  Progress: 7609 on 8630  Progress: 7610 on 8630  Progress: 7611 on 8630  Progress: 7612 on 8630  Progress: 7613 on 8630  Progress: 7614 on 8630  Progress: 7615 on 8630  Progress: 7616 on 8630  Progress: 7617 on 8630  Progress: 7618 on 8630  Progress: 7619 on 8630  Progress: 7620 on 8630  Progress: 7621 on 8630  Progress: 7622 on 8630  Progress: 7623 on 8630  Progress: 7624 on 8630  Progress: 7625 on 8630  Progress: 7626 on 8630  Progress: 7627 on 8630  Progress: 7628 on 8630  Progress: 7629 on 8630  Progress: 7630 on 8630  Progress: 7631 on 8630  Progress: 7632 on 8630  Progress: 7633 on 8630  Progress: 7634 on 8630  Progress: 7635 on 8630  Progress: 7636 on 8630  Progress: 7637 on 8630  Progress: 7638 on 8630  Progress: 7639 on 8630  Progress: 7640 on 8630  Progress: 7641 on 8630  Progress: 7642 on 8630  Progress: 7643 on 8630  Progress: 7644 on 8630  Progress: 7645 on 8630  Progress: 7646 on 8630  Progress: 7647 on 8630  Progress: 7648 on 8630  Progress: 7649 on 8630  Progress: 7650 on 8630  Progress: 7651 on 8630  Progress: 7652 on 8630  Progress: 7653 on 8630  Progress: 7654 on 8630  Progress: 7655 on 8630  Progress: 7656 on 8630  Progress: 7657 on 8630  Progress: 7658 on 8630  Progress: 7659 on 8630  Progress: 7660 on 8630  Progress: 7661 on 8630  Progress: 7662 on 8630  Progress: 7663 on 8630  Progress: 7664 on 8630  Progress: 7665 on 8630  Progress: 7666 on 8630  Progress: 7667 on 8630  Progress: 7668 on 8630  Progress: 7669 on 8630  Progress: 7670 on 8630  Progress: 7671 on 8630  Progress: 7672 on 8630  Progress: 7673 on 8630  Progress: 7674 on 8630  Progress: 7675 on 8630  Progress: 7676 on 8630  Progress: 7677 on 8630  Progress: 7678 on 8630  Progress: 7679 on 8630  Progress: 7680 on 8630  Progress: 7681 on 8630  Progress: 7682 on 8630  Progress: 7683 on 8630  Progress: 7684 on 8630  Progress: 7685 on 8630  Progress: 7686 on 8630  Progress: 7687 on 8630  Progress: 7688 on 8630  Progress: 7689 on 8630  Progress: 7690 on 8630  Progress: 7691 on 8630  Progress: 7692 on 8630  Progress: 7693 on 8630  Progress: 7694 on 8630  Progress: 7695 on 8630  Progress: 7696 on 8630  Progress: 7697 on 8630  Progress: 7698 on 8630  Progress: 7699 on 8630  Progress: 7700 on 8630  Progress: 7701 on 8630  Progress: 7702 on 8630  Progress: 7703 on 8630  Progress: 7704 on 8630  Progress: 7705 on 8630  Progress: 7706 on 8630  Progress: 7707 on 8630  Progress: 7708 on 8630  Progress: 7709 on 8630  Progress: 7710 on 8630  Progress: 7711 on 8630  Progress: 7712 on 8630  Progress: 7713 on 8630  Progress: 7714 on 8630  Progress: 7715 on 8630  Progress: 7716 on 8630  Progress: 7717 on 8630  Progress: 7718 on 8630  Progress: 7719 on 8630  Progress: 7720 on 8630  Progress: 7721 on 8630  Progress: 7722 on 8630  Progress: 7723 on 8630  Progress: 7724 on 8630  Progress: 7725 on 8630  Progress: 7726 on 8630  Progress: 7727 on 8630  Progress: 7728 on 8630  Progress: 7729 on 8630  Progress: 7730 on 8630  Progress: 7731 on 8630  Progress: 7732 on 8630  Progress: 7733 on 8630  Progress: 7734 on 8630  Progress: 7735 on 8630  Progress: 7736 on 8630  Progress: 7737 on 8630  Progress: 7738 on 8630  Progress: 7739 on 8630  Progress: 7740 on 8630  Progress: 7741 on 8630  Progress: 7742 on 8630  Progress: 7743 on 8630  Progress: 7744 on 8630  Progress: 7745 on 8630  Progress: 7746 on 8630  Progress: 7747 on 8630  Progress: 7748 on 8630  Progress: 7749 on 8630  Progress: 7750 on 8630  Progress: 7751 on 8630  Progress: 7752 on 8630  Progress: 7753 on 8630  Progress: 7754 on 8630  Progress: 7755 on 8630  Progress: 7756 on 8630  Progress: 7757 on 8630  Progress: 7758 on 8630  Progress: 7759 on 8630  Progress: 7760 on 8630  Progress: 7761 on 8630  Progress: 7762 on 8630  Progress: 7763 on 8630  Progress: 7764 on 8630  Progress: 7765 on 8630  Progress: 7766 on 8630  Progress: 7767 on 8630  Progress: 7768 on 8630  Progress: 7769 on 8630  Progress: 7770 on 8630  Progress: 7771 on 8630  Progress: 7772 on 8630  Progress: 7773 on 8630  Progress: 7774 on 8630  Progress: 7775 on 8630  Progress: 7776 on 8630  Progress: 7777 on 8630  Progress: 7778 on 8630  Progress: 7779 on 8630  Progress: 7780 on 8630  Progress: 7781 on 8630  Progress: 7782 on 8630  Progress: 7783 on 8630  Progress: 7784 on 8630  Progress: 7785 on 8630  Progress: 7786 on 8630  Progress: 7787 on 8630  Progress: 7788 on 8630  Progress: 7789 on 8630  Progress: 7790 on 8630  Progress: 7791 on 8630  Progress: 7792 on 8630  Progress: 7793 on 8630  Progress: 7794 on 8630  Progress: 7795 on 8630  Progress: 7796 on 8630  Progress: 7797 on 8630  Progress: 7798 on 8630  Progress: 7799 on 8630  Progress: 7800 on 8630  Progress: 7801 on 8630  Progress: 7802 on 8630  Progress: 7803 on 8630  Progress: 7804 on 8630  Progress: 7805 on 8630  Progress: 7806 on 8630  Progress: 7807 on 8630  Progress: 7808 on 8630  Progress: 7809 on 8630  Progress: 7810 on 8630  Progress: 7811 on 8630  Progress: 7812 on 8630  Progress: 7813 on 8630  Progress: 7814 on 8630  Progress: 7815 on 8630  Progress: 7816 on 8630  Progress: 7817 on 8630  Progress: 7818 on 8630  Progress: 7819 on 8630  Progress: 7820 on 8630  Progress: 7821 on 8630  Progress: 7822 on 8630  Progress: 7823 on 8630  Progress: 7824 on 8630  Progress: 7825 on 8630  Progress: 7826 on 8630  Progress: 7827 on 8630  Progress: 7828 on 8630  Progress: 7829 on 8630  Progress: 7830 on 8630  Progress: 7831 on 8630  Progress: 7832 on 8630  Progress: 7833 on 8630  Progress: 7834 on 8630  Progress: 7835 on 8630  Progress: 7836 on 8630  Progress: 7837 on 8630  Progress: 7838 on 8630  Progress: 7839 on 8630  Progress: 7840 on 8630  Progress: 7841 on 8630  Progress: 7842 on 8630  Progress: 7843 on 8630  Progress: 7844 on 8630  Progress: 7845 on 8630  Progress: 7846 on 8630  Progress: 7847 on 8630  Progress: 7848 on 8630  Progress: 7849 on 8630  Progress: 7850 on 8630  Progress: 7851 on 8630  Progress: 7852 on 8630  Progress: 7853 on 8630  Progress: 7854 on 8630  Progress: 7855 on 8630  Progress: 7856 on 8630  Progress: 7857 on 8630  Progress: 7858 on 8630  Progress: 7859 on 8630  Progress: 7860 on 8630  Progress: 7861 on 8630  Progress: 7862 on 8630  Progress: 7863 on 8630  Progress: 7864 on 8630  Progress: 7865 on 8630  Progress: 7866 on 8630  Progress: 7867 on 8630  Progress: 7868 on 8630  Progress: 7869 on 8630  Progress: 7870 on 8630  Progress: 7871 on 8630  Progress: 7872 on 8630  Progress: 7873 on 8630  Progress: 7874 on 8630  Progress: 7875 on 8630  Progress: 7876 on 8630  Progress: 7877 on 8630  Progress: 7878 on 8630  Progress: 7879 on 8630  Progress: 7880 on 8630  Progress: 7881 on 8630  Progress: 7882 on 8630  Progress: 7883 on 8630  Progress: 7884 on 8630  Progress: 7885 on 8630  Progress: 7886 on 8630  Progress: 7887 on 8630  Progress: 7888 on 8630  Progress: 7889 on 8630  Progress: 7890 on 8630  Progress: 7891 on 8630  Progress: 7892 on 8630  Progress: 7893 on 8630  Progress: 7894 on 8630  Progress: 7895 on 8630  Progress: 7896 on 8630  Progress: 7897 on 8630  Progress: 7898 on 8630  Progress: 7899 on 8630  Progress: 7900 on 8630  Progress: 7901 on 8630  Progress: 7902 on 8630  Progress: 7903 on 8630  Progress: 7904 on 8630  Progress: 7905 on 8630  Progress: 7906 on 8630  Progress: 7907 on 8630  Progress: 7908 on 8630  Progress: 7909 on 8630  Progress: 7910 on 8630  Progress: 7911 on 8630  Progress: 7912 on 8630  Progress: 7913 on 8630  Progress: 7914 on 8630  Progress: 7915 on 8630  Progress: 7916 on 8630  Progress: 7917 on 8630  Progress: 7918 on 8630  Progress: 7919 on 8630  Progress: 7920 on 8630  Progress: 7921 on 8630  Progress: 7922 on 8630  Progress: 7923 on 8630  Progress: 7924 on 8630  Progress: 7925 on 8630  Progress: 7926 on 8630  Progress: 7927 on 8630  Progress: 7928 on 8630  Progress: 7929 on 8630  Progress: 7930 on 8630  Progress: 7931 on 8630  Progress: 7932 on 8630  Progress: 7933 on 8630  Progress: 7934 on 8630  Progress: 7935 on 8630  Progress: 7936 on 8630  Progress: 7937 on 8630  Progress: 7938 on 8630  Progress: 7939 on 8630  Progress: 7940 on 8630  Progress: 7941 on 8630  Progress: 7942 on 8630  Progress: 7943 on 8630  Progress: 7944 on 8630  Progress: 7945 on 8630  Progress: 7946 on 8630  Progress: 7947 on 8630  Progress: 7948 on 8630  Progress: 7949 on 8630  Progress: 7950 on 8630  Progress: 7951 on 8630  Progress: 7952 on 8630  Progress: 7953 on 8630  Progress: 7954 on 8630  Progress: 7955 on 8630  Progress: 7956 on 8630  Progress: 7957 on 8630  Progress: 7958 on 8630  Progress: 7959 on 8630  Progress: 7960 on 8630  Progress: 7961 on 8630  Progress: 7962 on 8630  Progress: 7963 on 8630  Progress: 7964 on 8630  Progress: 7965 on 8630  Progress: 7966 on 8630  Progress: 7967 on 8630  Progress: 7968 on 8630  Progress: 7969 on 8630  Progress: 7970 on 8630  Progress: 7971 on 8630  Progress: 7972 on 8630  Progress: 7973 on 8630  Progress: 7974 on 8630  Progress: 7975 on 8630  Progress: 7976 on 8630  Progress: 7977 on 8630  Progress: 7978 on 8630  Progress: 7979 on 8630  Progress: 7980 on 8630  Progress: 7981 on 8630  Progress: 7982 on 8630  Progress: 7983 on 8630  Progress: 7984 on 8630  Progress: 7985 on 8630  Progress: 7986 on 8630  Progress: 7987 on 8630  Progress: 7988 on 8630  Progress: 7989 on 8630  Progress: 7990 on 8630  Progress: 7991 on 8630  Progress: 7992 on 8630  Progress: 7993 on 8630  Progress: 7994 on 8630  Progress: 7995 on 8630  Progress: 7996 on 8630  Progress: 7997 on 8630  Progress: 7998 on 8630  Progress: 7999 on 8630  Progress: 8000 on 8630  Progress: 8001 on 8630  Progress: 8002 on 8630  Progress: 8003 on 8630  Progress: 8004 on 8630  Progress: 8005 on 8630  Progress: 8006 on 8630  Progress: 8007 on 8630  Progress: 8008 on 8630  Progress: 8009 on 8630  Progress: 8010 on 8630  Progress: 8011 on 8630  Progress: 8012 on 8630  Progress: 8013 on 8630  Progress: 8014 on 8630  Progress: 8015 on 8630  Progress: 8016 on 8630  Progress: 8017 on 8630  Progress: 8018 on 8630  Progress: 8019 on 8630  Progress: 8020 on 8630  Progress: 8021 on 8630  Progress: 8022 on 8630  Progress: 8023 on 8630  Progress: 8024 on 8630  Progress: 8025 on 8630  Progress: 8026 on 8630  Progress: 8027 on 8630  Progress: 8028 on 8630  Progress: 8029 on 8630  Progress: 8030 on 8630  Progress: 8031 on 8630  Progress: 8032 on 8630  Progress: 8033 on 8630  Progress: 8034 on 8630  Progress: 8035 on 8630  Progress: 8036 on 8630  Progress: 8037 on 8630  Progress: 8038 on 8630  Progress: 8039 on 8630  Progress: 8040 on 8630  Progress: 8041 on 8630  Progress: 8042 on 8630  Progress: 8043 on 8630  Progress: 8044 on 8630  Progress: 8045 on 8630  Progress: 8046 on 8630  Progress: 8047 on 8630  Progress: 8048 on 8630  Progress: 8049 on 8630  Progress: 8050 on 8630  Progress: 8051 on 8630  Progress: 8052 on 8630  Progress: 8053 on 8630  Progress: 8054 on 8630  Progress: 8055 on 8630  Progress: 8056 on 8630  Progress: 8057 on 8630  Progress: 8058 on 8630  Progress: 8059 on 8630  Progress: 8060 on 8630  Progress: 8061 on 8630  Progress: 8062 on 8630  Progress: 8063 on 8630  Progress: 8064 on 8630  Progress: 8065 on 8630  Progress: 8066 on 8630  Progress: 8067 on 8630  Progress: 8068 on 8630  Progress: 8069 on 8630  Progress: 8070 on 8630  Progress: 8071 on 8630  Progress: 8072 on 8630  Progress: 8073 on 8630  Progress: 8074 on 8630  Progress: 8075 on 8630  Progress: 8076 on 8630  Progress: 8077 on 8630  Progress: 8078 on 8630  Progress: 8079 on 8630  Progress: 8080 on 8630  Progress: 8081 on 8630  Progress: 8082 on 8630  Progress: 8083 on 8630  Progress: 8084 on 8630  Progress: 8085 on 8630  Progress: 8086 on 8630  Progress: 8087 on 8630  Progress: 8088 on 8630  Progress: 8089 on 8630  Progress: 8090 on 8630  Progress: 8091 on 8630  Progress: 8092 on 8630  Progress: 8093 on 8630  Progress: 8094 on 8630  Progress: 8095 on 8630  Progress: 8096 on 8630  Progress: 8097 on 8630  Progress: 8098 on 8630  Progress: 8099 on 8630  Progress: 8100 on 8630  Progress: 8101 on 8630  Progress: 8102 on 8630  Progress: 8103 on 8630  Progress: 8104 on 8630  Progress: 8105 on 8630  Progress: 8106 on 8630  Progress: 8107 on 8630  Progress: 8108 on 8630  Progress: 8109 on 8630  Progress: 8110 on 8630  Progress: 8111 on 8630  Progress: 8112 on 8630  Progress: 8113 on 8630  Progress: 8114 on 8630  Progress: 8115 on 8630  Progress: 8116 on 8630  Progress: 8117 on 8630  Progress: 8118 on 8630  Progress: 8119 on 8630  Progress: 8120 on 8630  Progress: 8121 on 8630  Progress: 8122 on 8630  Progress: 8123 on 8630  Progress: 8124 on 8630  Progress: 8125 on 8630  Progress: 8126 on 8630  Progress: 8127 on 8630  Progress: 8128 on 8630  Progress: 8129 on 8630  Progress: 8130 on 8630  Progress: 8131 on 8630  Progress: 8132 on 8630  Progress: 8133 on 8630  Progress: 8134 on 8630  Progress: 8135 on 8630  Progress: 8136 on 8630  Progress: 8137 on 8630  Progress: 8138 on 8630  Progress: 8139 on 8630  Progress: 8140 on 8630  Progress: 8141 on 8630  Progress: 8142 on 8630  Progress: 8143 on 8630  Progress: 8144 on 8630  Progress: 8145 on 8630  Progress: 8146 on 8630  Progress: 8147 on 8630  Progress: 8148 on 8630  Progress: 8149 on 8630  Progress: 8150 on 8630  Progress: 8151 on 8630  Progress: 8152 on 8630  Progress: 8153 on 8630  Progress: 8154 on 8630  Progress: 8155 on 8630  Progress: 8156 on 8630  Progress: 8157 on 8630  Progress: 8158 on 8630  Progress: 8159 on 8630  Progress: 8160 on 8630  Progress: 8161 on 8630  Progress: 8162 on 8630  Progress: 8163 on 8630  Progress: 8164 on 8630  Progress: 8165 on 8630  Progress: 8166 on 8630  Progress: 8167 on 8630  Progress: 8168 on 8630  Progress: 8169 on 8630  Progress: 8170 on 8630  Progress: 8171 on 8630  Progress: 8172 on 8630  Progress: 8173 on 8630  Progress: 8174 on 8630  Progress: 8175 on 8630  Progress: 8176 on 8630  Progress: 8177 on 8630  Progress: 8178 on 8630  Progress: 8179 on 8630  Progress: 8180 on 8630  Progress: 8181 on 8630  Progress: 8182 on 8630  Progress: 8183 on 8630  Progress: 8184 on 8630  Progress: 8185 on 8630  Progress: 8186 on 8630  Progress: 8187 on 8630  Progress: 8188 on 8630  Progress: 8189 on 8630  Progress: 8190 on 8630  Progress: 8191 on 8630  Progress: 8192 on 8630  Progress: 8193 on 8630  Progress: 8194 on 8630  Progress: 8195 on 8630  Progress: 8196 on 8630  Progress: 8197 on 8630  Progress: 8198 on 8630  Progress: 8199 on 8630  Progress: 8200 on 8630  Progress: 8201 on 8630  Progress: 8202 on 8630  Progress: 8203 on 8630  Progress: 8204 on 8630  Progress: 8205 on 8630  Progress: 8206 on 8630  Progress: 8207 on 8630  Progress: 8208 on 8630  Progress: 8209 on 8630  Progress: 8210 on 8630  Progress: 8211 on 8630  Progress: 8212 on 8630  Progress: 8213 on 8630  Progress: 8214 on 8630  Progress: 8215 on 8630  Progress: 8216 on 8630  Progress: 8217 on 8630  Progress: 8218 on 8630  Progress: 8219 on 8630  Progress: 8220 on 8630  Progress: 8221 on 8630  Progress: 8222 on 8630  Progress: 8223 on 8630  Progress: 8224 on 8630  Progress: 8225 on 8630  Progress: 8226 on 8630  Progress: 8227 on 8630  Progress: 8228 on 8630  Progress: 8229 on 8630  Progress: 8230 on 8630  Progress: 8231 on 8630  Progress: 8232 on 8630  Progress: 8233 on 8630  Progress: 8234 on 8630  Progress: 8235 on 8630  Progress: 8236 on 8630  Progress: 8237 on 8630  Progress: 8238 on 8630  Progress: 8239 on 8630  Progress: 8240 on 8630  Progress: 8241 on 8630  Progress: 8242 on 8630  Progress: 8243 on 8630  Progress: 8244 on 8630  Progress: 8245 on 8630  Progress: 8246 on 8630  Progress: 8247 on 8630  Progress: 8248 on 8630  Progress: 8249 on 8630  Progress: 8250 on 8630  Progress: 8251 on 8630  Progress: 8252 on 8630  Progress: 8253 on 8630  Progress: 8254 on 8630  Progress: 8255 on 8630  Progress: 8256 on 8630  Progress: 8257 on 8630  Progress: 8258 on 8630  Progress: 8259 on 8630  Progress: 8260 on 8630  Progress: 8261 on 8630  Progress: 8262 on 8630  Progress: 8263 on 8630  Progress: 8264 on 8630  Progress: 8265 on 8630  Progress: 8266 on 8630  Progress: 8267 on 8630  Progress: 8268 on 8630  Progress: 8269 on 8630  Progress: 8270 on 8630  Progress: 8271 on 8630  Progress: 8272 on 8630  Progress: 8273 on 8630  Progress: 8274 on 8630  Progress: 8275 on 8630  Progress: 8276 on 8630  Progress: 8277 on 8630  Progress: 8278 on 8630  Progress: 8279 on 8630  Progress: 8280 on 8630  Progress: 8281 on 8630  Progress: 8282 on 8630  Progress: 8283 on 8630  Progress: 8284 on 8630  Progress: 8285 on 8630  Progress: 8286 on 8630  Progress: 8287 on 8630  Progress: 8288 on 8630  Progress: 8289 on 8630  Progress: 8290 on 8630  Progress: 8291 on 8630  Progress: 8292 on 8630  Progress: 8293 on 8630  Progress: 8294 on 8630  Progress: 8295 on 8630  Progress: 8296 on 8630  Progress: 8297 on 8630  Progress: 8298 on 8630  Progress: 8299 on 8630  Progress: 8300 on 8630  Progress: 8301 on 8630  Progress: 8302 on 8630  Progress: 8303 on 8630  Progress: 8304 on 8630  Progress: 8305 on 8630  Progress: 8306 on 8630  Progress: 8307 on 8630  Progress: 8308 on 8630  Progress: 8309 on 8630  Progress: 8310 on 8630  Progress: 8311 on 8630  Progress: 8312 on 8630  Progress: 8313 on 8630  Progress: 8314 on 8630  Progress: 8315 on 8630  Progress: 8316 on 8630  Progress: 8317 on 8630  Progress: 8318 on 8630  Progress: 8319 on 8630  Progress: 8320 on 8630  Progress: 8321 on 8630  Progress: 8322 on 8630  Progress: 8323 on 8630  Progress: 8324 on 8630  Progress: 8325 on 8630  Progress: 8326 on 8630  Progress: 8327 on 8630  Progress: 8328 on 8630  Progress: 8329 on 8630  Progress: 8330 on 8630  Progress: 8331 on 8630  Progress: 8332 on 8630  Progress: 8333 on 8630  Progress: 8334 on 8630  Progress: 8335 on 8630  Progress: 8336 on 8630  Progress: 8337 on 8630  Progress: 8338 on 8630  Progress: 8339 on 8630  Progress: 8340 on 8630  Progress: 8341 on 8630  Progress: 8342 on 8630  Progress: 8343 on 8630  Progress: 8344 on 8630  Progress: 8345 on 8630  Progress: 8346 on 8630  Progress: 8347 on 8630  Progress: 8348 on 8630  Progress: 8349 on 8630  Progress: 8350 on 8630  Progress: 8351 on 8630  Progress: 8352 on 8630  Progress: 8353 on 8630  Progress: 8354 on 8630  Progress: 8355 on 8630  Progress: 8356 on 8630  Progress: 8357 on 8630  Progress: 8358 on 8630  Progress: 8359 on 8630  Progress: 8360 on 8630  Progress: 8361 on 8630  Progress: 8362 on 8630  Progress: 8363 on 8630  Progress: 8364 on 8630  Progress: 8365 on 8630  Progress: 8366 on 8630  Progress: 8367 on 8630  Progress: 8368 on 8630  Progress: 8369 on 8630  Progress: 8370 on 8630  Progress: 8371 on 8630  Progress: 8372 on 8630  Progress: 8373 on 8630  Progress: 8374 on 8630  Progress: 8375 on 8630  Progress: 8376 on 8630  Progress: 8377 on 8630  Progress: 8378 on 8630  Progress: 8379 on 8630  Progress: 8380 on 8630  Progress: 8381 on 8630  Progress: 8382 on 8630  Progress: 8383 on 8630  Progress: 8384 on 8630  Progress: 8385 on 8630  Progress: 8386 on 8630  Progress: 8387 on 8630  Progress: 8388 on 8630  Progress: 8389 on 8630  Progress: 8390 on 8630  Progress: 8391 on 8630  Progress: 8392 on 8630  Progress: 8393 on 8630  Progress: 8394 on 8630  Progress: 8395 on 8630  Progress: 8396 on 8630  Progress: 8397 on 8630  Progress: 8398 on 8630  Progress: 8399 on 8630  Progress: 8400 on 8630  Progress: 8401 on 8630  Progress: 8402 on 8630  Progress: 8403 on 8630  Progress: 8404 on 8630  Progress: 8405 on 8630  Progress: 8406 on 8630  Progress: 8407 on 8630  Progress: 8408 on 8630  Progress: 8409 on 8630  Progress: 8410 on 8630  Progress: 8411 on 8630  Progress: 8412 on 8630  Progress: 8413 on 8630  Progress: 8414 on 8630  Progress: 8415 on 8630  Progress: 8416 on 8630  Progress: 8417 on 8630  Progress: 8418 on 8630  Progress: 8419 on 8630  Progress: 8420 on 8630  Progress: 8421 on 8630  Progress: 8422 on 8630  Progress: 8423 on 8630  Progress: 8424 on 8630  Progress: 8425 on 8630  Progress: 8426 on 8630  Progress: 8427 on 8630  Progress: 8428 on 8630  Progress: 8429 on 8630  Progress: 8430 on 8630  Progress: 8431 on 8630  Progress: 8432 on 8630  Progress: 8433 on 8630  Progress: 8434 on 8630  Progress: 8435 on 8630  Progress: 8436 on 8630  Progress: 8437 on 8630  Progress: 8438 on 8630  Progress: 8439 on 8630  Progress: 8440 on 8630  Progress: 8441 on 8630  Progress: 8442 on 8630  Progress: 8443 on 8630  Progress: 8444 on 8630  Progress: 8445 on 8630  Progress: 8446 on 8630  Progress: 8447 on 8630  Progress: 8448 on 8630  Progress: 8449 on 8630  Progress: 8450 on 8630  Progress: 8451 on 8630  Progress: 8452 on 8630  Progress: 8453 on 8630  Progress: 8454 on 8630  Progress: 8455 on 8630  Progress: 8456 on 8630  Progress: 8457 on 8630  Progress: 8458 on 8630  Progress: 8459 on 8630  Progress: 8460 on 8630  Progress: 8461 on 8630  Progress: 8462 on 8630  Progress: 8463 on 8630  Progress: 8464 on 8630  Progress: 8465 on 8630  Progress: 8466 on 8630  Progress: 8467 on 8630  Progress: 8468 on 8630  Progress: 8469 on 8630  Progress: 8470 on 8630  Progress: 8471 on 8630  Progress: 8472 on 8630  Progress: 8473 on 8630  Progress: 8474 on 8630  Progress: 8475 on 8630  Progress: 8476 on 8630  Progress: 8477 on 8630  Progress: 8478 on 8630  Progress: 8479 on 8630  Progress: 8480 on 8630  Progress: 8481 on 8630  Progress: 8482 on 8630  Progress: 8483 on 8630  Progress: 8484 on 8630  Progress: 8485 on 8630  Progress: 8486 on 8630  Progress: 8487 on 8630  Progress: 8488 on 8630  Progress: 8489 on 8630  Progress: 8490 on 8630  Progress: 8491 on 8630  Progress: 8492 on 8630  Progress: 8493 on 8630  Progress: 8494 on 8630  Progress: 8495 on 8630  Progress: 8496 on 8630  Progress: 8497 on 8630  Progress: 8498 on 8630  Progress: 8499 on 8630  Progress: 8500 on 8630  Progress: 8501 on 8630  Progress: 8502 on 8630  Progress: 8503 on 8630  Progress: 8504 on 8630  Progress: 8505 on 8630  Progress: 8506 on 8630  Progress: 8507 on 8630  Progress: 8508 on 8630  Progress: 8509 on 8630  Progress: 8510 on 8630  Progress: 8511 on 8630  Progress: 8512 on 8630  Progress: 8513 on 8630  Progress: 8514 on 8630  Progress: 8515 on 8630  Progress: 8516 on 8630  Progress: 8517 on 8630  Progress: 8518 on 8630  Progress: 8519 on 8630  Progress: 8520 on 8630  Progress: 8521 on 8630  Progress: 8522 on 8630  Progress: 8523 on 8630  Progress: 8524 on 8630  Progress: 8525 on 8630  Progress: 8526 on 8630  Progress: 8527 on 8630  Progress: 8528 on 8630  Progress: 8529 on 8630  Progress: 8530 on 8630  Progress: 8531 on 8630  Progress: 8532 on 8630  Progress: 8533 on 8630  Progress: 8534 on 8630  Progress: 8535 on 8630  Progress: 8536 on 8630  Progress: 8537 on 8630  Progress: 8538 on 8630  Progress: 8539 on 8630  Progress: 8540 on 8630  Progress: 8541 on 8630  Progress: 8542 on 8630  Progress: 8543 on 8630  Progress: 8544 on 8630  Progress: 8545 on 8630  Progress: 8546 on 8630  Progress: 8547 on 8630  Progress: 8548 on 8630  Progress: 8549 on 8630  Progress: 8550 on 8630  Progress: 8551 on 8630  Progress: 8552 on 8630  Progress: 8553 on 8630  Progress: 8554 on 8630  Progress: 8555 on 8630  Progress: 8556 on 8630  Progress: 8557 on 8630  Progress: 8558 on 8630  Progress: 8559 on 8630  Progress: 8560 on 8630  Progress: 8561 on 8630  Progress: 8562 on 8630  Progress: 8563 on 8630  Progress: 8564 on 8630  Progress: 8565 on 8630  Progress: 8566 on 8630  Progress: 8567 on 8630  Progress: 8568 on 8630  Progress: 8569 on 8630  Progress: 8570 on 8630  Progress: 8571 on 8630  Progress: 8572 on 8630  Progress: 8573 on 8630  Progress: 8574 on 8630  Progress: 8575 on 8630  Progress: 8576 on 8630  Progress: 8577 on 8630  Progress: 8578 on 8630  Progress: 8579 on 8630  Progress: 8580 on 8630  Progress: 8581 on 8630  Progress: 8582 on 8630  Progress: 8583 on 8630  Progress: 8584 on 8630  Progress: 8585 on 8630  Progress: 8586 on 8630  Progress: 8587 on 8630  Progress: 8588 on 8630  Progress: 8589 on 8630  Progress: 8590 on 8630  Progress: 8591 on 8630  Progress: 8592 on 8630  Progress: 8593 on 8630  Progress: 8594 on 8630  Progress: 8595 on 8630  Progress: 8596 on 8630  Progress: 8597 on 8630  Progress: 8598 on 8630  Progress: 8599 on 8630  Progress: 8600 on 8630  Progress: 8601 on 8630  Progress: 8602 on 8630  Progress: 8603 on 8630  Progress: 8604 on 8630  Progress: 8605 on 8630  Progress: 8606 on 8630  Progress: 8607 on 8630  Progress: 8608 on 8630  Progress: 8609 on 8630  Progress: 8610 on 8630  Progress: 8611 on 8630  Progress: 8612 on 8630  Progress: 8613 on 8630  Progress: 8614 on 8630  Progress: 8615 on 8630  Progress: 8616 on 8630  Progress: 8617 on 8630  Progress: 8618 on 8630  Progress: 8619 on 8630  Progress: 8620 on 8630  Progress: 8621 on 8630  Progress: 8622 on 8630  Progress: 8623 on 8630  Progress: 8624 on 8630  Progress: 8625 on 8630  Progress: 8626 on 8630  Progress: 8627 on 8630  Progress: 8628 on 8630  Progress: 8629 on 8630  Progress: 8630 on 8630  
za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
argument is not an atomic vector; coercing
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),as.character(miejsce_wydania)),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu)

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(!grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa|dotycz|pol",X500,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
  
#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,AM_AUTOR_ID,AM_NAZWISKO,AM_IMIE),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL")
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(noquote(kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700).",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700).",sep = "# ")),as.character(polaczone$za_adnotacje))
#korekta automatycznego IOK
automatyczny_IOK <- polaczone %>%
  mutate(czy_tyt_oryg = (!grepl("polsk",DZ_NAZWA)&!is.na(za_tytul_oryginalu))|grepl("polsk",DZ_NAZWA)) %>%
  filter(za_adnotacje==""&am_nazwisko!="NA"&!grepl("pseud|nazw",za_opis_fizyczny_ksiazki)&!grepl("\\|",am_nazwisko)&czy_tyt_oryg==TRUE) %>%
  select(rekord_BN) %>%
  unique() %>%
  filter(rekord_BN %notin% data$ZA_UWAGI[data$czy_automatycznie=="nie"]) %>%
  mutate(automatyczny_import = "tak")

write.csv2(automatyczny_IOK, "C:/Users/Cezary/Desktop/imp_2009_automatyczne_podmiotowe.csv", row.names = F, na = '', fileEncoding = 'UTF-8')

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}
Progress:  1 on 16  Progress:  2 on 16  Progress:  3 on 16  Progress:  4 on 16  Progress:  5 on 16  Progress:  6 on 16  Progress:  7 on 16  Progress:  8 on 16  Progress:  9 on 16  Progress: 10 on 16  Progress: 11 on 16  Progress: 12 on 16  Progress: 13 on 16  Progress: 14 on 16  Progress: 15 on 16  Progress: 16 on 16  
out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

#przypisanie do automatycznego OK redaktora "automat"
out <- out %>%
  mutate(pracownik = ifelse(rekord_BN %in% automatyczny_IOK$rekord_BN,"AUTOMAT",as.character(pracownik))) %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))

x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/Cezary/Desktop/2009_podmiotowa_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_przedm",sep = ""))
#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- BN_autor %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
#pole 245
marc_field_245 <- BN_autor %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
BN_autor <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  unique() %>%
  mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  unique() %>%
  mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE, X245c = `$c`)
  
x <- 1:lengths(BN_autor[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_autor$czy_nazwisko[i] <- grepl(BN_autor$AM_NAZWISKO[i],BN_autor$X245c[i])
  BN_autor$czy_imie[i] <- grepl(BN_autor$AM_IMIE[i],BN_autor$X245c[i])
}
Progress:    1 on 2007  Progress:    2 on 2007  Progress:    3 on 2007  Progress:    4 on 2007  Progress:    5 on 2007  Progress:    6 on 2007  Progress:    7 on 2007  Progress:    8 on 2007  Progress:    9 on 2007  Progress:   10 on 2007  Progress:   11 on 2007  Progress:   12 on 2007  Progress:   13 on 2007  Progress:   14 on 2007  Progress:   15 on 2007  Progress:   16 on 2007  Progress:   17 on 2007  Progress:   18 on 2007  Progress:   19 on 2007  Progress:   20 on 2007  Progress:   21 on 2007  Progress:   22 on 2007  Progress:   23 on 2007  Progress:   24 on 2007  Progress:   25 on 2007  Progress:   26 on 2007  Progress:   27 on 2007  Progress:   28 on 2007  Progress:   29 on 2007  Progress:   30 on 2007  Progress:   31 on 2007  Progress:   32 on 2007  Progress:   33 on 2007  Progress:   34 on 2007  Progress:   35 on 2007  Progress:   36 on 2007  Progress:   37 on 2007  Progress:   38 on 2007  Progress:   39 on 2007  Progress:   40 on 2007  Progress:   41 on 2007  Progress:   42 on 2007  Progress:   43 on 2007  Progress:   44 on 2007  Progress:   45 on 2007  Progress:   46 on 2007  Progress:   47 on 2007  Progress:   48 on 2007  Progress:   49 on 2007  Progress:   50 on 2007  Progress:   51 on 2007  Progress:   52 on 2007  Progress:   53 on 2007  Progress:   54 on 2007  Progress:   55 on 2007  Progress:   56 on 2007  Progress:   57 on 2007  Progress:   58 on 2007  Progress:   59 on 2007  Progress:   60 on 2007  Progress:   61 on 2007  Progress:   62 on 2007  Progress:   63 on 2007  Progress:   64 on 2007  Progress:   65 on 2007  Progress:   66 on 2007  Progress:   67 on 2007  Progress:   68 on 2007  Progress:   69 on 2007  Progress:   70 on 2007  Progress:   71 on 2007  Progress:   72 on 2007  Progress:   73 on 2007  Progress:   74 on 2007  Progress:   75 on 2007  Progress:   76 on 2007  Progress:   77 on 2007  Progress:   78 on 2007  Progress:   79 on 2007  Progress:   80 on 2007  Progress:   81 on 2007  Progress:   82 on 2007  Progress:   83 on 2007  Progress:   84 on 2007  Progress:   85 on 2007  Progress:   86 on 2007  Progress:   87 on 2007  Progress:   88 on 2007  Progress:   89 on 2007  Progress:   90 on 2007  Progress:   91 on 2007  Progress:   92 on 2007  Progress:   93 on 2007  Progress:   94 on 2007  Progress:   95 on 2007  Progress:   96 on 2007  Progress:   97 on 2007  Progress:   98 on 2007  Progress:   99 on 2007  Progress:  100 on 2007  Progress:  101 on 2007  Progress:  102 on 2007  Progress:  103 on 2007  Progress:  104 on 2007  Progress:  105 on 2007  Progress:  106 on 2007  Progress:  107 on 2007  Progress:  108 on 2007  Progress:  109 on 2007  Progress:  110 on 2007  Progress:  111 on 2007  Progress:  112 on 2007  Progress:  113 on 2007  Progress:  114 on 2007  Progress:  115 on 2007  Progress:  116 on 2007  Progress:  117 on 2007  Progress:  118 on 2007  Progress:  119 on 2007  Progress:  120 on 2007  Progress:  121 on 2007  Progress:  122 on 2007  Progress:  123 on 2007  Progress:  124 on 2007  Progress:  125 on 2007  Progress:  126 on 2007  Progress:  127 on 2007  Progress:  128 on 2007  Progress:  129 on 2007  Progress:  130 on 2007  Progress:  131 on 2007  Progress:  132 on 2007  Progress:  133 on 2007  Progress:  134 on 2007  Progress:  135 on 2007  Progress:  136 on 2007  Progress:  137 on 2007  Progress:  138 on 2007  Progress:  139 on 2007  Progress:  140 on 2007  Progress:  141 on 2007  Progress:  142 on 2007  Progress:  143 on 2007  Progress:  144 on 2007  Progress:  145 on 2007  Progress:  146 on 2007  Progress:  147 on 2007  Progress:  148 on 2007  Progress:  149 on 2007  Progress:  150 on 2007  Progress:  151 on 2007  Progress:  152 on 2007  Progress:  153 on 2007  Progress:  154 on 2007  Progress:  155 on 2007  Progress:  156 on 2007  Progress:  157 on 2007  Progress:  158 on 2007  Progress:  159 on 2007  Progress:  160 on 2007  Progress:  161 on 2007  Progress:  162 on 2007  Progress:  163 on 2007  Progress:  164 on 2007  Progress:  165 on 2007  Progress:  166 on 2007  Progress:  167 on 2007  Progress:  168 on 2007  Progress:  169 on 2007  Progress:  170 on 2007  Progress:  171 on 2007  Progress:  172 on 2007  Progress:  173 on 2007  Progress:  174 on 2007  Progress:  175 on 2007  Progress:  176 on 2007  Progress:  177 on 2007  Progress:  178 on 2007  Progress:  179 on 2007  Progress:  180 on 2007  Progress:  181 on 2007  Progress:  182 on 2007  Progress:  183 on 2007  Progress:  184 on 2007  Progress:  185 on 2007  Progress:  186 on 2007  Progress:  187 on 2007  Progress:  188 on 2007  Progress:  189 on 2007  Progress:  190 on 2007  Progress:  191 on 2007  Progress:  192 on 2007  Progress:  193 on 2007  Progress:  194 on 2007  Progress:  195 on 2007  Progress:  196 on 2007  Progress:  197 on 2007  Progress:  198 on 2007  Progress:  199 on 2007  Progress:  200 on 2007  Progress:  201 on 2007  Progress:  202 on 2007  Progress:  203 on 2007  Progress:  204 on 2007  Progress:  205 on 2007  Progress:  206 on 2007  Progress:  207 on 2007  Progress:  208 on 2007  Progress:  209 on 2007  Progress:  210 on 2007  Progress:  211 on 2007  Progress:  212 on 2007  Progress:  213 on 2007  Progress:  214 on 2007  Progress:  215 on 2007  Progress:  216 on 2007  Progress:  217 on 2007  Progress:  218 on 2007  Progress:  219 on 2007  Progress:  220 on 2007  Progress:  221 on 2007  Progress:  222 on 2007  Progress:  223 on 2007  Progress:  224 on 2007  Progress:  225 on 2007  Progress:  226 on 2007  Progress:  227 on 2007  Progress:  228 on 2007  Progress:  229 on 2007  Progress:  230 on 2007  Progress:  231 on 2007  Progress:  232 on 2007  Progress:  233 on 2007  Progress:  234 on 2007  Progress:  235 on 2007  Progress:  236 on 2007  Progress:  237 on 2007  Progress:  238 on 2007  Progress:  239 on 2007  Progress:  240 on 2007  Progress:  241 on 2007  Progress:  242 on 2007  Progress:  243 on 2007  Progress:  244 on 2007  Progress:  245 on 2007  Progress:  246 on 2007  Progress:  247 on 2007  Progress:  248 on 2007  Progress:  249 on 2007  Progress:  250 on 2007  Progress:  251 on 2007  Progress:  252 on 2007  Progress:  253 on 2007  Progress:  254 on 2007  Progress:  255 on 2007  Progress:  256 on 2007  Progress:  257 on 2007  Progress:  258 on 2007  Progress:  259 on 2007  Progress:  260 on 2007  Progress:  261 on 2007  Progress:  262 on 2007  Progress:  263 on 2007  Progress:  264 on 2007  Progress:  265 on 2007  Progress:  266 on 2007  Progress:  267 on 2007  Progress:  268 on 2007  Progress:  269 on 2007  Progress:  270 on 2007  Progress:  271 on 2007  Progress:  272 on 2007  Progress:  273 on 2007  Progress:  274 on 2007  Progress:  275 on 2007  Progress:  276 on 2007  Progress:  277 on 2007  Progress:  278 on 2007  Progress:  279 on 2007  Progress:  280 on 2007  Progress:  281 on 2007  Progress:  282 on 2007  Progress:  283 on 2007  Progress:  284 on 2007  Progress:  285 on 2007  Progress:  286 on 2007  Progress:  287 on 2007  Progress:  288 on 2007  Progress:  289 on 2007  Progress:  290 on 2007  Progress:  291 on 2007  Progress:  292 on 2007  Progress:  293 on 2007  Progress:  294 on 2007  Progress:  295 on 2007  Progress:  296 on 2007  Progress:  297 on 2007  Progress:  298 on 2007  Progress:  299 on 2007  Progress:  300 on 2007  Progress:  301 on 2007  Progress:  302 on 2007  Progress:  303 on 2007  Progress:  304 on 2007  Progress:  305 on 2007  Progress:  306 on 2007  Progress:  307 on 2007  Progress:  308 on 2007  Progress:  309 on 2007  Progress:  310 on 2007  Progress:  311 on 2007  Progress:  312 on 2007  Progress:  313 on 2007  Progress:  314 on 2007  Progress:  315 on 2007  Progress:  316 on 2007  Progress:  317 on 2007  Progress:  318 on 2007  Progress:  319 on 2007  Progress:  320 on 2007  Progress:  321 on 2007  Progress:  322 on 2007  Progress:  323 on 2007  Progress:  324 on 2007  Progress:  325 on 2007  Progress:  326 on 2007  Progress:  327 on 2007  Progress:  328 on 2007  Progress:  329 on 2007  Progress:  330 on 2007  Progress:  331 on 2007  Progress:  332 on 2007  Progress:  333 on 2007  Progress:  334 on 2007  Progress:  335 on 2007  Progress:  336 on 2007  Progress:  337 on 2007  Progress:  338 on 2007  Progress:  339 on 2007  Progress:  340 on 2007  Progress:  341 on 2007  Progress:  342 on 2007  Progress:  343 on 2007  Progress:  344 on 2007  Progress:  345 on 2007  Progress:  346 on 2007  Progress:  347 on 2007  Progress:  348 on 2007  Progress:  349 on 2007  Progress:  350 on 2007  Progress:  351 on 2007  Progress:  352 on 2007  Progress:  353 on 2007  Progress:  354 on 2007  Progress:  355 on 2007  Progress:  356 on 2007  Progress:  357 on 2007  Progress:  358 on 2007  Progress:  359 on 2007  Progress:  360 on 2007  Progress:  361 on 2007  Progress:  362 on 2007  Progress:  363 on 2007  Progress:  364 on 2007  Progress:  365 on 2007  Progress:  366 on 2007  Progress:  367 on 2007  Progress:  368 on 2007  Progress:  369 on 2007  Progress:  370 on 2007  Progress:  371 on 2007  Progress:  372 on 2007  Progress:  373 on 2007  Progress:  374 on 2007  Progress:  375 on 2007  Progress:  376 on 2007  Progress:  377 on 2007  Progress:  378 on 2007  Progress:  379 on 2007  Progress:  380 on 2007  Progress:  381 on 2007  Progress:  382 on 2007  Progress:  383 on 2007  Progress:  384 on 2007  Progress:  385 on 2007  Progress:  386 on 2007  Progress:  387 on 2007  Progress:  388 on 2007  Progress:  389 on 2007  Progress:  390 on 2007  Progress:  391 on 2007  Progress:  392 on 2007  Progress:  393 on 2007  Progress:  394 on 2007  Progress:  395 on 2007  Progress:  396 on 2007  Progress:  397 on 2007  Progress:  398 on 2007  Progress:  399 on 2007  Progress:  400 on 2007  Progress:  401 on 2007  Progress:  402 on 2007  Progress:  403 on 2007  Progress:  404 on 2007  Progress:  405 on 2007  Progress:  406 on 2007  Progress:  407 on 2007  Progress:  408 on 2007  Progress:  409 on 2007  Progress:  410 on 2007  Progress:  411 on 2007  Progress:  412 on 2007  Progress:  413 on 2007  Progress:  414 on 2007  Progress:  415 on 2007  Progress:  416 on 2007  Progress:  417 on 2007  Progress:  418 on 2007  Progress:  419 on 2007  Progress:  420 on 2007  Progress:  421 on 2007  Progress:  422 on 2007  Progress:  423 on 2007  Progress:  424 on 2007  Progress:  425 on 2007  Progress:  426 on 2007  Progress:  427 on 2007  Progress:  428 on 2007  Progress:  429 on 2007  Progress:  430 on 2007  Progress:  431 on 2007  Progress:  432 on 2007  Progress:  433 on 2007  Progress:  434 on 2007  Progress:  435 on 2007  Progress:  436 on 2007  Progress:  437 on 2007  Progress:  438 on 2007  Progress:  439 on 2007  Progress:  440 on 2007  Progress:  441 on 2007  Progress:  442 on 2007  Progress:  443 on 2007  Progress:  444 on 2007  Progress:  445 on 2007  Progress:  446 on 2007  Progress:  447 on 2007  Progress:  448 on 2007  Progress:  449 on 2007  Progress:  450 on 2007  Progress:  451 on 2007  Progress:  452 on 2007  Progress:  453 on 2007  Progress:  454 on 2007  Progress:  455 on 2007  Progress:  456 on 2007  Progress:  457 on 2007  Progress:  458 on 2007  Progress:  459 on 2007  Progress:  460 on 2007  Progress:  461 on 2007  Progress:  462 on 2007  Progress:  463 on 2007  Progress:  464 on 2007  Progress:  465 on 2007  Progress:  466 on 2007  Progress:  467 on 2007  Progress:  468 on 2007  Progress:  469 on 2007  Progress:  470 on 2007  Progress:  471 on 2007  Progress:  472 on 2007  Progress:  473 on 2007  Progress:  474 on 2007  Progress:  475 on 2007  Progress:  476 on 2007  Progress:  477 on 2007  Progress:  478 on 2007  Progress:  479 on 2007  Progress:  480 on 2007  Progress:  481 on 2007  Progress:  482 on 2007  Progress:  483 on 2007  Progress:  484 on 2007  Progress:  485 on 2007  Progress:  486 on 2007  Progress:  487 on 2007  Progress:  488 on 2007  Progress:  489 on 2007  Progress:  490 on 2007  Progress:  491 on 2007  Progress:  492 on 2007  Progress:  493 on 2007  Progress:  494 on 2007  Progress:  495 on 2007  Progress:  496 on 2007  Progress:  497 on 2007  Progress:  498 on 2007  Progress:  499 on 2007  Progress:  500 on 2007  Progress:  501 on 2007  Progress:  502 on 2007  Progress:  503 on 2007  Progress:  504 on 2007  Progress:  505 on 2007  Progress:  506 on 2007  Progress:  507 on 2007  Progress:  508 on 2007  Progress:  509 on 2007  Progress:  510 on 2007  Progress:  511 on 2007  Progress:  512 on 2007  Progress:  513 on 2007  Progress:  514 on 2007  Progress:  515 on 2007  Progress:  516 on 2007  Progress:  517 on 2007  Progress:  518 on 2007  Progress:  519 on 2007  Progress:  520 on 2007  Progress:  521 on 2007  Progress:  522 on 2007  Progress:  523 on 2007  Progress:  524 on 2007  Progress:  525 on 2007  Progress:  526 on 2007  Progress:  527 on 2007  Progress:  528 on 2007  Progress:  529 on 2007  Progress:  530 on 2007  Progress:  531 on 2007  Progress:  532 on 2007  Progress:  533 on 2007  Progress:  534 on 2007  Progress:  535 on 2007  Progress:  536 on 2007  Progress:  537 on 2007  Progress:  538 on 2007  Progress:  539 on 2007  Progress:  540 on 2007  Progress:  541 on 2007  Progress:  542 on 2007  Progress:  543 on 2007  Progress:  544 on 2007  Progress:  545 on 2007  Progress:  546 on 2007  Progress:  547 on 2007  Progress:  548 on 2007  Progress:  549 on 2007  Progress:  550 on 2007  Progress:  551 on 2007  Progress:  552 on 2007  Progress:  553 on 2007  Progress:  554 on 2007  Progress:  555 on 2007  Progress:  556 on 2007  Progress:  557 on 2007  Progress:  558 on 2007  Progress:  559 on 2007  Progress:  560 on 2007  Progress:  561 on 2007  Progress:  562 on 2007  Progress:  563 on 2007  Progress:  564 on 2007  Progress:  565 on 2007  Progress:  566 on 2007  Progress:  567 on 2007  Progress:  568 on 2007  Progress:  569 on 2007  Progress:  570 on 2007  Progress:  571 on 2007  Progress:  572 on 2007  Progress:  573 on 2007  Progress:  574 on 2007  Progress:  575 on 2007  Progress:  576 on 2007  Progress:  577 on 2007  Progress:  578 on 2007  Progress:  579 on 2007  Progress:  580 on 2007  Progress:  581 on 2007  Progress:  582 on 2007  Progress:  583 on 2007  Progress:  584 on 2007  Progress:  585 on 2007  Progress:  586 on 2007  Progress:  587 on 2007  Progress:  588 on 2007  Progress:  589 on 2007  Progress:  590 on 2007  Progress:  591 on 2007  Progress:  592 on 2007  Progress:  593 on 2007  Progress:  594 on 2007  Progress:  595 on 2007  Progress:  596 on 2007  Progress:  597 on 2007  Progress:  598 on 2007  Progress:  599 on 2007  Progress:  600 on 2007  Progress:  601 on 2007  Progress:  602 on 2007  Progress:  603 on 2007  Progress:  604 on 2007  Progress:  605 on 2007  Progress:  606 on 2007  Progress:  607 on 2007  Progress:  608 on 2007  Progress:  609 on 2007  Progress:  610 on 2007  Progress:  611 on 2007  Progress:  612 on 2007  Progress:  613 on 2007  Progress:  614 on 2007  Progress:  615 on 2007  Progress:  616 on 2007  Progress:  617 on 2007  Progress:  618 on 2007  Progress:  619 on 2007  Progress:  620 on 2007  Progress:  621 on 2007  Progress:  622 on 2007  Progress:  623 on 2007  Progress:  624 on 2007  Progress:  625 on 2007  Progress:  626 on 2007  Progress:  627 on 2007  Progress:  628 on 2007  Progress:  629 on 2007  Progress:  630 on 2007  Progress:  631 on 2007  Progress:  632 on 2007  Progress:  633 on 2007  Progress:  634 on 2007  Progress:  635 on 2007  Progress:  636 on 2007  Progress:  637 on 2007  Progress:  638 on 2007  Progress:  639 on 2007  Progress:  640 on 2007  Progress:  641 on 2007  Progress:  642 on 2007  Progress:  643 on 2007  Progress:  644 on 2007  Progress:  645 on 2007  Progress:  646 on 2007  Progress:  647 on 2007  Progress:  648 on 2007  Progress:  649 on 2007  Progress:  650 on 2007  Progress:  651 on 2007  Progress:  652 on 2007  Progress:  653 on 2007  Progress:  654 on 2007  Progress:  655 on 2007  Progress:  656 on 2007  Progress:  657 on 2007  Progress:  658 on 2007  Progress:  659 on 2007  Progress:  660 on 2007  Progress:  661 on 2007  Progress:  662 on 2007  Progress:  663 on 2007  Progress:  664 on 2007  Progress:  665 on 2007  Progress:  666 on 2007  Progress:  667 on 2007  Progress:  668 on 2007  Progress:  669 on 2007  Progress:  670 on 2007  Progress:  671 on 2007  Progress:  672 on 2007  Progress:  673 on 2007  Progress:  674 on 2007  Progress:  675 on 2007  Progress:  676 on 2007  Progress:  677 on 2007  Progress:  678 on 2007  Progress:  679 on 2007  Progress:  680 on 2007  Progress:  681 on 2007  Progress:  682 on 2007  Progress:  683 on 2007  Progress:  684 on 2007  Progress:  685 on 2007  Progress:  686 on 2007  Progress:  687 on 2007  Progress:  688 on 2007  Progress:  689 on 2007  Progress:  690 on 2007  Progress:  691 on 2007  Progress:  692 on 2007  Progress:  693 on 2007  Progress:  694 on 2007  Progress:  695 on 2007  Progress:  696 on 2007  Progress:  697 on 2007  Progress:  698 on 2007  Progress:  699 on 2007  Progress:  700 on 2007  Progress:  701 on 2007  Progress:  702 on 2007  Progress:  703 on 2007  Progress:  704 on 2007  Progress:  705 on 2007  Progress:  706 on 2007  Progress:  707 on 2007  Progress:  708 on 2007  Progress:  709 on 2007  Progress:  710 on 2007  Progress:  711 on 2007  Progress:  712 on 2007  Progress:  713 on 2007  Progress:  714 on 2007  Progress:  715 on 2007  Progress:  716 on 2007  Progress:  717 on 2007  Progress:  718 on 2007  Progress:  719 on 2007  Progress:  720 on 2007  Progress:  721 on 2007  Progress:  722 on 2007  Progress:  723 on 2007  Progress:  724 on 2007  Progress:  725 on 2007  Progress:  726 on 2007  Progress:  727 on 2007  Progress:  728 on 2007  Progress:  729 on 2007  Progress:  730 on 2007  Progress:  731 on 2007  Progress:  732 on 2007  Progress:  733 on 2007  Progress:  734 on 2007  Progress:  735 on 2007  Progress:  736 on 2007  Progress:  737 on 2007  Progress:  738 on 2007  Progress:  739 on 2007  Progress:  740 on 2007  Progress:  741 on 2007  Progress:  742 on 2007  Progress:  743 on 2007  Progress:  744 on 2007  Progress:  745 on 2007  Progress:  746 on 2007  Progress:  747 on 2007  Progress:  748 on 2007  Progress:  749 on 2007  Progress:  750 on 2007  Progress:  751 on 2007  Progress:  752 on 2007  Progress:  753 on 2007  Progress:  754 on 2007  Progress:  755 on 2007  Progress:  756 on 2007  Progress:  757 on 2007  Progress:  758 on 2007  Progress:  759 on 2007  Progress:  760 on 2007  Progress:  761 on 2007  Progress:  762 on 2007  Progress:  763 on 2007  Progress:  764 on 2007  Progress:  765 on 2007  Progress:  766 on 2007  Progress:  767 on 2007  Progress:  768 on 2007  Progress:  769 on 2007  Progress:  770 on 2007  Progress:  771 on 2007  Progress:  772 on 2007  Progress:  773 on 2007  Progress:  774 on 2007  Progress:  775 on 2007  Progress:  776 on 2007  Progress:  777 on 2007  Progress:  778 on 2007  Progress:  779 on 2007  Progress:  780 on 2007  Progress:  781 on 2007  Progress:  782 on 2007  Progress:  783 on 2007  Progress:  784 on 2007  Progress:  785 on 2007  Progress:  786 on 2007  Progress:  787 on 2007  Progress:  788 on 2007  Progress:  789 on 2007  Progress:  790 on 2007  Progress:  791 on 2007  Progress:  792 on 2007  Progress:  793 on 2007  Progress:  794 on 2007  Progress:  795 on 2007  Progress:  796 on 2007  Progress:  797 on 2007  Progress:  798 on 2007  Progress:  799 on 2007  Progress:  800 on 2007  Progress:  801 on 2007  Progress:  802 on 2007  Progress:  803 on 2007  Progress:  804 on 2007  Progress:  805 on 2007  Progress:  806 on 2007  Progress:  807 on 2007  Progress:  808 on 2007  Progress:  809 on 2007  Progress:  810 on 2007  Progress:  811 on 2007  Progress:  812 on 2007  Progress:  813 on 2007  Progress:  814 on 2007  Progress:  815 on 2007  Progress:  816 on 2007  Progress:  817 on 2007  Progress:  818 on 2007  Progress:  819 on 2007  Progress:  820 on 2007  Progress:  821 on 2007  Progress:  822 on 2007  Progress:  823 on 2007  Progress:  824 on 2007  Progress:  825 on 2007  Progress:  826 on 2007  Progress:  827 on 2007  Progress:  828 on 2007  Progress:  829 on 2007  Progress:  830 on 2007  Progress:  831 on 2007  Progress:  832 on 2007  Progress:  833 on 2007  Progress:  834 on 2007  Progress:  835 on 2007  Progress:  836 on 2007  Progress:  837 on 2007  Progress:  838 on 2007  Progress:  839 on 2007  Progress:  840 on 2007  Progress:  841 on 2007  Progress:  842 on 2007  Progress:  843 on 2007  Progress:  844 on 2007  Progress:  845 on 2007  Progress:  846 on 2007  Progress:  847 on 2007  Progress:  848 on 2007  Progress:  849 on 2007  Progress:  850 on 2007  Progress:  851 on 2007  Progress:  852 on 2007  Progress:  853 on 2007  Progress:  854 on 2007  Progress:  855 on 2007  Progress:  856 on 2007  Progress:  857 on 2007  Progress:  858 on 2007  Progress:  859 on 2007  Progress:  860 on 2007  Progress:  861 on 2007  Progress:  862 on 2007  Progress:  863 on 2007  Progress:  864 on 2007  Progress:  865 on 2007  Progress:  866 on 2007  Progress:  867 on 2007  Progress:  868 on 2007  Progress:  869 on 2007  Progress:  870 on 2007  Progress:  871 on 2007  Progress:  872 on 2007  Progress:  873 on 2007  Progress:  874 on 2007  Progress:  875 on 2007  Progress:  876 on 2007  Progress:  877 on 2007  Progress:  878 on 2007  Progress:  879 on 2007  Progress:  880 on 2007  Progress:  881 on 2007  Progress:  882 on 2007  Progress:  883 on 2007  Progress:  884 on 2007  Progress:  885 on 2007  Progress:  886 on 2007  Progress:  887 on 2007  Progress:  888 on 2007  Progress:  889 on 2007  Progress:  890 on 2007  Progress:  891 on 2007  Progress:  892 on 2007  Progress:  893 on 2007  Progress:  894 on 2007  Progress:  895 on 2007  Progress:  896 on 2007  Progress:  897 on 2007  Progress:  898 on 2007  Progress:  899 on 2007  Progress:  900 on 2007  Progress:  901 on 2007  Progress:  902 on 2007  Progress:  903 on 2007  Progress:  904 on 2007  Progress:  905 on 2007  Progress:  906 on 2007  Progress:  907 on 2007  Progress:  908 on 2007  Progress:  909 on 2007  Progress:  910 on 2007  Progress:  911 on 2007  Progress:  912 on 2007  Progress:  913 on 2007  Progress:  914 on 2007  Progress:  915 on 2007  Progress:  916 on 2007  Progress:  917 on 2007  Progress:  918 on 2007  Progress:  919 on 2007  Progress:  920 on 2007  Progress:  921 on 2007  Progress:  922 on 2007  Progress:  923 on 2007  Progress:  924 on 2007  Progress:  925 on 2007  Progress:  926 on 2007  Progress:  927 on 2007  Progress:  928 on 2007  Progress:  929 on 2007  Progress:  930 on 2007  Progress:  931 on 2007  Progress:  932 on 2007  Progress:  933 on 2007  Progress:  934 on 2007  Progress:  935 on 2007  Progress:  936 on 2007  Progress:  937 on 2007  Progress:  938 on 2007  Progress:  939 on 2007  Progress:  940 on 2007  Progress:  941 on 2007  Progress:  942 on 2007  Progress:  943 on 2007  Progress:  944 on 2007  Progress:  945 on 2007  Progress:  946 on 2007  Progress:  947 on 2007  Progress:  948 on 2007  Progress:  949 on 2007  Progress:  950 on 2007  Progress:  951 on 2007  Progress:  952 on 2007  Progress:  953 on 2007  Progress:  954 on 2007  Progress:  955 on 2007  Progress:  956 on 2007  Progress:  957 on 2007  Progress:  958 on 2007  Progress:  959 on 2007  Progress:  960 on 2007  Progress:  961 on 2007  Progress:  962 on 2007  Progress:  963 on 2007  Progress:  964 on 2007  Progress:  965 on 2007  Progress:  966 on 2007  Progress:  967 on 2007  Progress:  968 on 2007  Progress:  969 on 2007  Progress:  970 on 2007  Progress:  971 on 2007  Progress:  972 on 2007  Progress:  973 on 2007  Progress:  974 on 2007  Progress:  975 on 2007  Progress:  976 on 2007  Progress:  977 on 2007  Progress:  978 on 2007  Progress:  979 on 2007  Progress:  980 on 2007  Progress:  981 on 2007  Progress:  982 on 2007  Progress:  983 on 2007  Progress:  984 on 2007  Progress:  985 on 2007  Progress:  986 on 2007  Progress:  987 on 2007  Progress:  988 on 2007  Progress:  989 on 2007  Progress:  990 on 2007  Progress:  991 on 2007  Progress:  992 on 2007  Progress:  993 on 2007  Progress:  994 on 2007  Progress:  995 on 2007  Progress:  996 on 2007  Progress:  997 on 2007  Progress:  998 on 2007  Progress:  999 on 2007  Progress: 1000 on 2007  Progress: 1001 on 2007  Progress: 1002 on 2007  Progress: 1003 on 2007  Progress: 1004 on 2007  Progress: 1005 on 2007  Progress: 1006 on 2007  Progress: 1007 on 2007  Progress: 1008 on 2007  Progress: 1009 on 2007  Progress: 1010 on 2007  Progress: 1011 on 2007  Progress: 1012 on 2007  Progress: 1013 on 2007  Progress: 1014 on 2007  Progress: 1015 on 2007  Progress: 1016 on 2007  Progress: 1017 on 2007  Progress: 1018 on 2007  Progress: 1019 on 2007  Progress: 1020 on 2007  Progress: 1021 on 2007  Progress: 1022 on 2007  Progress: 1023 on 2007  Progress: 1024 on 2007  Progress: 1025 on 2007  Progress: 1026 on 2007  Progress: 1027 on 2007  Progress: 1028 on 2007  Progress: 1029 on 2007  Progress: 1030 on 2007  Progress: 1031 on 2007  Progress: 1032 on 2007  Progress: 1033 on 2007  Progress: 1034 on 2007  Progress: 1035 on 2007  Progress: 1036 on 2007  Progress: 1037 on 2007  Progress: 1038 on 2007  Progress: 1039 on 2007  Progress: 1040 on 2007  Progress: 1041 on 2007  Progress: 1042 on 2007  Progress: 1043 on 2007  Progress: 1044 on 2007  Progress: 1045 on 2007  Progress: 1046 on 2007  Progress: 1047 on 2007  Progress: 1048 on 2007  Progress: 1049 on 2007  Progress: 1050 on 2007  Progress: 1051 on 2007  Progress: 1052 on 2007  Progress: 1053 on 2007  Progress: 1054 on 2007  Progress: 1055 on 2007  Progress: 1056 on 2007  Progress: 1057 on 2007  Progress: 1058 on 2007  Progress: 1059 on 2007  Progress: 1060 on 2007  Progress: 1061 on 2007  Progress: 1062 on 2007  Progress: 1063 on 2007  Progress: 1064 on 2007  Progress: 1065 on 2007  Progress: 1066 on 2007  Progress: 1067 on 2007  Progress: 1068 on 2007  Progress: 1069 on 2007  Progress: 1070 on 2007  Progress: 1071 on 2007  Progress: 1072 on 2007  Progress: 1073 on 2007  Progress: 1074 on 2007  Progress: 1075 on 2007  Progress: 1076 on 2007  Progress: 1077 on 2007  Progress: 1078 on 2007  Progress: 1079 on 2007  Progress: 1080 on 2007  Progress: 1081 on 2007  Progress: 1082 on 2007  Progress: 1083 on 2007  Progress: 1084 on 2007  Progress: 1085 on 2007  Progress: 1086 on 2007  Progress: 1087 on 2007  Progress: 1088 on 2007  Progress: 1089 on 2007  Progress: 1090 on 2007  Progress: 1091 on 2007  Progress: 1092 on 2007  Progress: 1093 on 2007  Progress: 1094 on 2007  Progress: 1095 on 2007  Progress: 1096 on 2007  Progress: 1097 on 2007  Progress: 1098 on 2007  Progress: 1099 on 2007  Progress: 1100 on 2007  Progress: 1101 on 2007  Progress: 1102 on 2007  Progress: 1103 on 2007  Progress: 1104 on 2007  Progress: 1105 on 2007  Progress: 1106 on 2007  Progress: 1107 on 2007  Progress: 1108 on 2007  Progress: 1109 on 2007  Progress: 1110 on 2007  Progress: 1111 on 2007  Progress: 1112 on 2007  Progress: 1113 on 2007  Progress: 1114 on 2007  Progress: 1115 on 2007  Progress: 1116 on 2007  Progress: 1117 on 2007  Progress: 1118 on 2007  Progress: 1119 on 2007  Progress: 1120 on 2007  Progress: 1121 on 2007  Progress: 1122 on 2007  Progress: 1123 on 2007  Progress: 1124 on 2007  Progress: 1125 on 2007  Progress: 1126 on 2007  Progress: 1127 on 2007  Progress: 1128 on 2007  Progress: 1129 on 2007  Progress: 1130 on 2007  Progress: 1131 on 2007  Progress: 1132 on 2007  Progress: 1133 on 2007  Progress: 1134 on 2007  Progress: 1135 on 2007  Progress: 1136 on 2007  Progress: 1137 on 2007  Progress: 1138 on 2007  Progress: 1139 on 2007  Progress: 1140 on 2007  Progress: 1141 on 2007  Progress: 1142 on 2007  Progress: 1143 on 2007  Progress: 1144 on 2007  Progress: 1145 on 2007  Progress: 1146 on 2007  Progress: 1147 on 2007  Progress: 1148 on 2007  Progress: 1149 on 2007  Progress: 1150 on 2007  Progress: 1151 on 2007  Progress: 1152 on 2007  Progress: 1153 on 2007  Progress: 1154 on 2007  Progress: 1155 on 2007  Progress: 1156 on 2007  Progress: 1157 on 2007  Progress: 1158 on 2007  Progress: 1159 on 2007  Progress: 1160 on 2007  Progress: 1161 on 2007  Progress: 1162 on 2007  Progress: 1163 on 2007  Progress: 1164 on 2007  Progress: 1165 on 2007  Progress: 1166 on 2007  Progress: 1167 on 2007  Progress: 1168 on 2007  Progress: 1169 on 2007  Progress: 1170 on 2007  Progress: 1171 on 2007  Progress: 1172 on 2007  Progress: 1173 on 2007  Progress: 1174 on 2007  Progress: 1175 on 2007  Progress: 1176 on 2007  Progress: 1177 on 2007  Progress: 1178 on 2007  Progress: 1179 on 2007  Progress: 1180 on 2007  Progress: 1181 on 2007  Progress: 1182 on 2007  Progress: 1183 on 2007  Progress: 1184 on 2007  Progress: 1185 on 2007  Progress: 1186 on 2007  Progress: 1187 on 2007  Progress: 1188 on 2007  Progress: 1189 on 2007  Progress: 1190 on 2007  Progress: 1191 on 2007  Progress: 1192 on 2007  Progress: 1193 on 2007  Progress: 1194 on 2007  Progress: 1195 on 2007  Progress: 1196 on 2007  Progress: 1197 on 2007  Progress: 1198 on 2007  Progress: 1199 on 2007  Progress: 1200 on 2007  Progress: 1201 on 2007  Progress: 1202 on 2007  Progress: 1203 on 2007  Progress: 1204 on 2007  Progress: 1205 on 2007  Progress: 1206 on 2007  Progress: 1207 on 2007  Progress: 1208 on 2007  Progress: 1209 on 2007  Progress: 1210 on 2007  Progress: 1211 on 2007  Progress: 1212 on 2007  Progress: 1213 on 2007  Progress: 1214 on 2007  Progress: 1215 on 2007  Progress: 1216 on 2007  Progress: 1217 on 2007  Progress: 1218 on 2007  Progress: 1219 on 2007  Progress: 1220 on 2007  Progress: 1221 on 2007  Progress: 1222 on 2007  Progress: 1223 on 2007  Progress: 1224 on 2007  Progress: 1225 on 2007  Progress: 1226 on 2007  Progress: 1227 on 2007  Progress: 1228 on 2007  Progress: 1229 on 2007  Progress: 1230 on 2007  Progress: 1231 on 2007  Progress: 1232 on 2007  Progress: 1233 on 2007  Progress: 1234 on 2007  Progress: 1235 on 2007  Progress: 1236 on 2007  Progress: 1237 on 2007  Progress: 1238 on 2007  Progress: 1239 on 2007  Progress: 1240 on 2007  Progress: 1241 on 2007  Progress: 1242 on 2007  Progress: 1243 on 2007  Progress: 1244 on 2007  Progress: 1245 on 2007  Progress: 1246 on 2007  Progress: 1247 on 2007  Progress: 1248 on 2007  Progress: 1249 on 2007  Progress: 1250 on 2007  Progress: 1251 on 2007  Progress: 1252 on 2007  Progress: 1253 on 2007  Progress: 1254 on 2007  Progress: 1255 on 2007  Progress: 1256 on 2007  Progress: 1257 on 2007  Progress: 1258 on 2007  Progress: 1259 on 2007  Progress: 1260 on 2007  Progress: 1261 on 2007  Progress: 1262 on 2007  Progress: 1263 on 2007  Progress: 1264 on 2007  Progress: 1265 on 2007  Progress: 1266 on 2007  Progress: 1267 on 2007  Progress: 1268 on 2007  Progress: 1269 on 2007  Progress: 1270 on 2007  Progress: 1271 on 2007  Progress: 1272 on 2007  Progress: 1273 on 2007  Progress: 1274 on 2007  Progress: 1275 on 2007  Progress: 1276 on 2007  Progress: 1277 on 2007  Progress: 1278 on 2007  Progress: 1279 on 2007  Progress: 1280 on 2007  Progress: 1281 on 2007  Progress: 1282 on 2007  Progress: 1283 on 2007  Progress: 1284 on 2007  Progress: 1285 on 2007  Progress: 1286 on 2007  Progress: 1287 on 2007  Progress: 1288 on 2007  Progress: 1289 on 2007  Progress: 1290 on 2007  Progress: 1291 on 2007  Progress: 1292 on 2007  Progress: 1293 on 2007  Progress: 1294 on 2007  Progress: 1295 on 2007  Progress: 1296 on 2007  Progress: 1297 on 2007  Progress: 1298 on 2007  Progress: 1299 on 2007  Progress: 1300 on 2007  Progress: 1301 on 2007  Progress: 1302 on 2007  Progress: 1303 on 2007  Progress: 1304 on 2007  Progress: 1305 on 2007  Progress: 1306 on 2007  Progress: 1307 on 2007  Progress: 1308 on 2007  Progress: 1309 on 2007  Progress: 1310 on 2007  Progress: 1311 on 2007  Progress: 1312 on 2007  Progress: 1313 on 2007  Progress: 1314 on 2007  Progress: 1315 on 2007  Progress: 1316 on 2007  Progress: 1317 on 2007  Progress: 1318 on 2007  Progress: 1319 on 2007  Progress: 1320 on 2007  Progress: 1321 on 2007  Progress: 1322 on 2007  Progress: 1323 on 2007  Progress: 1324 on 2007  Progress: 1325 on 2007  Progress: 1326 on 2007  Progress: 1327 on 2007  Progress: 1328 on 2007  Progress: 1329 on 2007  Progress: 1330 on 2007  Progress: 1331 on 2007  Progress: 1332 on 2007  Progress: 1333 on 2007  Progress: 1334 on 2007  Progress: 1335 on 2007  Progress: 1336 on 2007  Progress: 1337 on 2007  Progress: 1338 on 2007  Progress: 1339 on 2007  Progress: 1340 on 2007  Progress: 1341 on 2007  Progress: 1342 on 2007  Progress: 1343 on 2007  Progress: 1344 on 2007  Progress: 1345 on 2007  Progress: 1346 on 2007  Progress: 1347 on 2007  Progress: 1348 on 2007  Progress: 1349 on 2007  Progress: 1350 on 2007  Progress: 1351 on 2007  Progress: 1352 on 2007  Progress: 1353 on 2007  Progress: 1354 on 2007  Progress: 1355 on 2007  Progress: 1356 on 2007  Progress: 1357 on 2007  Progress: 1358 on 2007  Progress: 1359 on 2007  Progress: 1360 on 2007  Progress: 1361 on 2007  Progress: 1362 on 2007  Progress: 1363 on 2007  Progress: 1364 on 2007  Progress: 1365 on 2007  Progress: 1366 on 2007  Progress: 1367 on 2007  Progress: 1368 on 2007  Progress: 1369 on 2007  Progress: 1370 on 2007  Progress: 1371 on 2007  Progress: 1372 on 2007  Progress: 1373 on 2007  Progress: 1374 on 2007  Progress: 1375 on 2007  Progress: 1376 on 2007  Progress: 1377 on 2007  Progress: 1378 on 2007  Progress: 1379 on 2007  Progress: 1380 on 2007  Progress: 1381 on 2007  Progress: 1382 on 2007  Progress: 1383 on 2007  Progress: 1384 on 2007  Progress: 1385 on 2007  Progress: 1386 on 2007  Progress: 1387 on 2007  Progress: 1388 on 2007  Progress: 1389 on 2007  Progress: 1390 on 2007  Progress: 1391 on 2007  Progress: 1392 on 2007  Progress: 1393 on 2007  Progress: 1394 on 2007  Progress: 1395 on 2007  Progress: 1396 on 2007  Progress: 1397 on 2007  Progress: 1398 on 2007  Progress: 1399 on 2007  Progress: 1400 on 2007  Progress: 1401 on 2007  Progress: 1402 on 2007  Progress: 1403 on 2007  Progress: 1404 on 2007  Progress: 1405 on 2007  Progress: 1406 on 2007  Progress: 1407 on 2007  Progress: 1408 on 2007  Progress: 1409 on 2007  Progress: 1410 on 2007  Progress: 1411 on 2007  Progress: 1412 on 2007  Progress: 1413 on 2007  Progress: 1414 on 2007  Progress: 1415 on 2007  Progress: 1416 on 2007  Progress: 1417 on 2007  Progress: 1418 on 2007  Progress: 1419 on 2007  Progress: 1420 on 2007  Progress: 1421 on 2007  Progress: 1422 on 2007  Progress: 1423 on 2007  Progress: 1424 on 2007  Progress: 1425 on 2007  Progress: 1426 on 2007  Progress: 1427 on 2007  Progress: 1428 on 2007  Progress: 1429 on 2007  Progress: 1430 on 2007  Progress: 1431 on 2007  Progress: 1432 on 2007  Progress: 1433 on 2007  Progress: 1434 on 2007  Progress: 1435 on 2007  Progress: 1436 on 2007  Progress: 1437 on 2007  Progress: 1438 on 2007  Progress: 1439 on 2007  Progress: 1440 on 2007  Progress: 1441 on 2007  Progress: 1442 on 2007  Progress: 1443 on 2007  Progress: 1444 on 2007  Progress: 1445 on 2007  Progress: 1446 on 2007  Progress: 1447 on 2007  Progress: 1448 on 2007  Progress: 1449 on 2007  Progress: 1450 on 2007  Progress: 1451 on 2007  Progress: 1452 on 2007  Progress: 1453 on 2007  Progress: 1454 on 2007  Progress: 1455 on 2007  Progress: 1456 on 2007  Progress: 1457 on 2007  Progress: 1458 on 2007  Progress: 1459 on 2007  Progress: 1460 on 2007  Progress: 1461 on 2007  Progress: 1462 on 2007  Progress: 1463 on 2007  Progress: 1464 on 2007  Progress: 1465 on 2007  Progress: 1466 on 2007  Progress: 1467 on 2007  Progress: 1468 on 2007  Progress: 1469 on 2007  Progress: 1470 on 2007  Progress: 1471 on 2007  Progress: 1472 on 2007  Progress: 1473 on 2007  Progress: 1474 on 2007  Progress: 1475 on 2007  Progress: 1476 on 2007  Progress: 1477 on 2007  Progress: 1478 on 2007  Progress: 1479 on 2007  Progress: 1480 on 2007  Progress: 1481 on 2007  Progress: 1482 on 2007  Progress: 1483 on 2007  Progress: 1484 on 2007  Progress: 1485 on 2007  Progress: 1486 on 2007  Progress: 1487 on 2007  Progress: 1488 on 2007  Progress: 1489 on 2007  Progress: 1490 on 2007  Progress: 1491 on 2007  Progress: 1492 on 2007  Progress: 1493 on 2007  Progress: 1494 on 2007  Progress: 1495 on 2007  Progress: 1496 on 2007  Progress: 1497 on 2007  Progress: 1498 on 2007  Progress: 1499 on 2007  Progress: 1500 on 2007  Progress: 1501 on 2007  Progress: 1502 on 2007  Progress: 1503 on 2007  Progress: 1504 on 2007  Progress: 1505 on 2007  Progress: 1506 on 2007  Progress: 1507 on 2007  Progress: 1508 on 2007  Progress: 1509 on 2007  Progress: 1510 on 2007  Progress: 1511 on 2007  Progress: 1512 on 2007  Progress: 1513 on 2007  Progress: 1514 on 2007  Progress: 1515 on 2007  Progress: 1516 on 2007  Progress: 1517 on 2007  Progress: 1518 on 2007  Progress: 1519 on 2007  Progress: 1520 on 2007  Progress: 1521 on 2007  Progress: 1522 on 2007  Progress: 1523 on 2007  Progress: 1524 on 2007  Progress: 1525 on 2007  Progress: 1526 on 2007  Progress: 1527 on 2007  Progress: 1528 on 2007  Progress: 1529 on 2007  Progress: 1530 on 2007  Progress: 1531 on 2007  Progress: 1532 on 2007  Progress: 1533 on 2007  Progress: 1534 on 2007  Progress: 1535 on 2007  Progress: 1536 on 2007  Progress: 1537 on 2007  Progress: 1538 on 2007  Progress: 1539 on 2007  Progress: 1540 on 2007  Progress: 1541 on 2007  Progress: 1542 on 2007  Progress: 1543 on 2007  Progress: 1544 on 2007  Progress: 1545 on 2007  Progress: 1546 on 2007  Progress: 1547 on 2007  Progress: 1548 on 2007  Progress: 1549 on 2007  Progress: 1550 on 2007  Progress: 1551 on 2007  Progress: 1552 on 2007  Progress: 1553 on 2007  Progress: 1554 on 2007  Progress: 1555 on 2007  Progress: 1556 on 2007  Progress: 1557 on 2007  Progress: 1558 on 2007  Progress: 1559 on 2007  Progress: 1560 on 2007  Progress: 1561 on 2007  Progress: 1562 on 2007  Progress: 1563 on 2007  Progress: 1564 on 2007  Progress: 1565 on 2007  Progress: 1566 on 2007  Progress: 1567 on 2007  Progress: 1568 on 2007  Progress: 1569 on 2007  Progress: 1570 on 2007  Progress: 1571 on 2007  Progress: 1572 on 2007  Progress: 1573 on 2007  Progress: 1574 on 2007  Progress: 1575 on 2007  Progress: 1576 on 2007  Progress: 1577 on 2007  Progress: 1578 on 2007  Progress: 1579 on 2007  Progress: 1580 on 2007  Progress: 1581 on 2007  Progress: 1582 on 2007  Progress: 1583 on 2007  Progress: 1584 on 2007  Progress: 1585 on 2007  Progress: 1586 on 2007  Progress: 1587 on 2007  Progress: 1588 on 2007  Progress: 1589 on 2007  Progress: 1590 on 2007  Progress: 1591 on 2007  Progress: 1592 on 2007  Progress: 1593 on 2007  Progress: 1594 on 2007  Progress: 1595 on 2007  Progress: 1596 on 2007  Progress: 1597 on 2007  Progress: 1598 on 2007  Progress: 1599 on 2007  Progress: 1600 on 2007  Progress: 1601 on 2007  Progress: 1602 on 2007  Progress: 1603 on 2007  Progress: 1604 on 2007  Progress: 1605 on 2007  Progress: 1606 on 2007  Progress: 1607 on 2007  Progress: 1608 on 2007  Progress: 1609 on 2007  Progress: 1610 on 2007  Progress: 1611 on 2007  Progress: 1612 on 2007  Progress: 1613 on 2007  Progress: 1614 on 2007  Progress: 1615 on 2007  Progress: 1616 on 2007  Progress: 1617 on 2007  Progress: 1618 on 2007  Progress: 1619 on 2007  Progress: 1620 on 2007  Progress: 1621 on 2007  Progress: 1622 on 2007  Progress: 1623 on 2007  Progress: 1624 on 2007  Progress: 1625 on 2007  Progress: 1626 on 2007  Progress: 1627 on 2007  Progress: 1628 on 2007  Progress: 1629 on 2007  Progress: 1630 on 2007  Progress: 1631 on 2007  Progress: 1632 on 2007  Progress: 1633 on 2007  Progress: 1634 on 2007  Progress: 1635 on 2007  Progress: 1636 on 2007  Progress: 1637 on 2007  Progress: 1638 on 2007  Progress: 1639 on 2007  Progress: 1640 on 2007  Progress: 1641 on 2007  Progress: 1642 on 2007  Progress: 1643 on 2007  Progress: 1644 on 2007  Progress: 1645 on 2007  Progress: 1646 on 2007  Progress: 1647 on 2007  Progress: 1648 on 2007  Progress: 1649 on 2007  Progress: 1650 on 2007  Progress: 1651 on 2007  Progress: 1652 on 2007  Progress: 1653 on 2007  Progress: 1654 on 2007  Progress: 1655 on 2007  Progress: 1656 on 2007  Progress: 1657 on 2007  Progress: 1658 on 2007  Progress: 1659 on 2007  Progress: 1660 on 2007  Progress: 1661 on 2007  Progress: 1662 on 2007  Progress: 1663 on 2007  Progress: 1664 on 2007  Progress: 1665 on 2007  Progress: 1666 on 2007  Progress: 1667 on 2007  Progress: 1668 on 2007  Progress: 1669 on 2007  Progress: 1670 on 2007  Progress: 1671 on 2007  Progress: 1672 on 2007  Progress: 1673 on 2007  Progress: 1674 on 2007  Progress: 1675 on 2007  Progress: 1676 on 2007  Progress: 1677 on 2007  Progress: 1678 on 2007  Progress: 1679 on 2007  Progress: 1680 on 2007  Progress: 1681 on 2007  Progress: 1682 on 2007  Progress: 1683 on 2007  Progress: 1684 on 2007  Progress: 1685 on 2007  Progress: 1686 on 2007  Progress: 1687 on 2007  Progress: 1688 on 2007  Progress: 1689 on 2007  Progress: 1690 on 2007  Progress: 1691 on 2007  Progress: 1692 on 2007  Progress: 1693 on 2007  Progress: 1694 on 2007  Progress: 1695 on 2007  Progress: 1696 on 2007  Progress: 1697 on 2007  Progress: 1698 on 2007  Progress: 1699 on 2007  Progress: 1700 on 2007  Progress: 1701 on 2007  Progress: 1702 on 2007  Progress: 1703 on 2007  Progress: 1704 on 2007  Progress: 1705 on 2007  Progress: 1706 on 2007  Progress: 1707 on 2007  Progress: 1708 on 2007  Progress: 1709 on 2007  Progress: 1710 on 2007  Progress: 1711 on 2007  Progress: 1712 on 2007  Progress: 1713 on 2007  Progress: 1714 on 2007  Progress: 1715 on 2007  Progress: 1716 on 2007  Progress: 1717 on 2007  Progress: 1718 on 2007  Progress: 1719 on 2007  Progress: 1720 on 2007  Progress: 1721 on 2007  Progress: 1722 on 2007  Progress: 1723 on 2007  Progress: 1724 on 2007  Progress: 1725 on 2007  Progress: 1726 on 2007  Progress: 1727 on 2007  Progress: 1728 on 2007  Progress: 1729 on 2007  Progress: 1730 on 2007  Progress: 1731 on 2007  Progress: 1732 on 2007  Progress: 1733 on 2007  Progress: 1734 on 2007  Progress: 1735 on 2007  Progress: 1736 on 2007  Progress: 1737 on 2007  Progress: 1738 on 2007  Progress: 1739 on 2007  Progress: 1740 on 2007  Progress: 1741 on 2007  Progress: 1742 on 2007  Progress: 1743 on 2007  Progress: 1744 on 2007  Progress: 1745 on 2007  Progress: 1746 on 2007  Progress: 1747 on 2007  Progress: 1748 on 2007  Progress: 1749 on 2007  Progress: 1750 on 2007  Progress: 1751 on 2007  Progress: 1752 on 2007  Progress: 1753 on 2007  Progress: 1754 on 2007  Progress: 1755 on 2007  Progress: 1756 on 2007  Progress: 1757 on 2007  Progress: 1758 on 2007  Progress: 1759 on 2007  Progress: 1760 on 2007  Progress: 1761 on 2007  Progress: 1762 on 2007  Progress: 1763 on 2007  Progress: 1764 on 2007  Progress: 1765 on 2007  Progress: 1766 on 2007  Progress: 1767 on 2007  Progress: 1768 on 2007  Progress: 1769 on 2007  Progress: 1770 on 2007  Progress: 1771 on 2007  Progress: 1772 on 2007  Progress: 1773 on 2007  Progress: 1774 on 2007  Progress: 1775 on 2007  Progress: 1776 on 2007  Progress: 1777 on 2007  Progress: 1778 on 2007  Progress: 1779 on 2007  Progress: 1780 on 2007  Progress: 1781 on 2007  Progress: 1782 on 2007  Progress: 1783 on 2007  Progress: 1784 on 2007  Progress: 1785 on 2007  Progress: 1786 on 2007  Progress: 1787 on 2007  Progress: 1788 on 2007  Progress: 1789 on 2007  Progress: 1790 on 2007  Progress: 1791 on 2007  Progress: 1792 on 2007  Progress: 1793 on 2007  Progress: 1794 on 2007  Progress: 1795 on 2007  Progress: 1796 on 2007  Progress: 1797 on 2007  Progress: 1798 on 2007  Progress: 1799 on 2007  Progress: 1800 on 2007  Progress: 1801 on 2007  Progress: 1802 on 2007  Progress: 1803 on 2007  Progress: 1804 on 2007  Progress: 1805 on 2007  Progress: 1806 on 2007  Progress: 1807 on 2007  Progress: 1808 on 2007  Progress: 1809 on 2007  Progress: 1810 on 2007  Progress: 1811 on 2007  Progress: 1812 on 2007  Progress: 1813 on 2007  Progress: 1814 on 2007  Progress: 1815 on 2007  Progress: 1816 on 2007  Progress: 1817 on 2007  Progress: 1818 on 2007  Progress: 1819 on 2007  Progress: 1820 on 2007  Progress: 1821 on 2007  Progress: 1822 on 2007  Progress: 1823 on 2007  Progress: 1824 on 2007  Progress: 1825 on 2007  Progress: 1826 on 2007  Progress: 1827 on 2007  Progress: 1828 on 2007  Progress: 1829 on 2007  Progress: 1830 on 2007  Progress: 1831 on 2007  Progress: 1832 on 2007  Progress: 1833 on 2007  Progress: 1834 on 2007  Progress: 1835 on 2007  Progress: 1836 on 2007  Progress: 1837 on 2007  Progress: 1838 on 2007  Progress: 1839 on 2007  Progress: 1840 on 2007  Progress: 1841 on 2007  Progress: 1842 on 2007  Progress: 1843 on 2007  Progress: 1844 on 2007  Progress: 1845 on 2007  Progress: 1846 on 2007  Progress: 1847 on 2007  Progress: 1848 on 2007  Progress: 1849 on 2007  Progress: 1850 on 2007  Progress: 1851 on 2007  Progress: 1852 on 2007  Progress: 1853 on 2007  Progress: 1854 on 2007  Progress: 1855 on 2007  Progress: 1856 on 2007  Progress: 1857 on 2007  Progress: 1858 on 2007  Progress: 1859 on 2007  Progress: 1860 on 2007  Progress: 1861 on 2007  Progress: 1862 on 2007  Progress: 1863 on 2007  Progress: 1864 on 2007  Progress: 1865 on 2007  Progress: 1866 on 2007  Progress: 1867 on 2007  Progress: 1868 on 2007  Progress: 1869 on 2007  Progress: 1870 on 2007  Progress: 1871 on 2007  Progress: 1872 on 2007  Progress: 1873 on 2007  Progress: 1874 on 2007  Progress: 1875 on 2007  Progress: 1876 on 2007  Progress: 1877 on 2007  Progress: 1878 on 2007  Progress: 1879 on 2007  Progress: 1880 on 2007  Progress: 1881 on 2007  Progress: 1882 on 2007  Progress: 1883 on 2007  Progress: 1884 on 2007  Progress: 1885 on 2007  Progress: 1886 on 2007  Progress: 1887 on 2007  Progress: 1888 on 2007  Progress: 1889 on 2007  Progress: 1890 on 2007  Progress: 1891 on 2007  Progress: 1892 on 2007  Progress: 1893 on 2007  Progress: 1894 on 2007  Progress: 1895 on 2007  Progress: 1896 on 2007  Progress: 1897 on 2007  Progress: 1898 on 2007  Progress: 1899 on 2007  Progress: 1900 on 2007  Progress: 1901 on 2007  Progress: 1902 on 2007  Progress: 1903 on 2007  Progress: 1904 on 2007  Progress: 1905 on 2007  Progress: 1906 on 2007  Progress: 1907 on 2007  Progress: 1908 on 2007  Progress: 1909 on 2007  Progress: 1910 on 2007  Progress: 1911 on 2007  Progress: 1912 on 2007  Progress: 1913 on 2007  Progress: 1914 on 2007  Progress: 1915 on 2007  Progress: 1916 on 2007  Progress: 1917 on 2007  Progress: 1918 on 2007  Progress: 1919 on 2007  Progress: 1920 on 2007  Progress: 1921 on 2007  Progress: 1922 on 2007  Progress: 1923 on 2007  Progress: 1924 on 2007  Progress: 1925 on 2007  Progress: 1926 on 2007  Progress: 1927 on 2007  Progress: 1928 on 2007  Progress: 1929 on 2007  Progress: 1930 on 2007  Progress: 1931 on 2007  Progress: 1932 on 2007  Progress: 1933 on 2007  Progress: 1934 on 2007  Progress: 1935 on 2007  Progress: 1936 on 2007  Progress: 1937 on 2007  Progress: 1938 on 2007  Progress: 1939 on 2007  Progress: 1940 on 2007  Progress: 1941 on 2007  Progress: 1942 on 2007  Progress: 1943 on 2007  Progress: 1944 on 2007  Progress: 1945 on 2007  Progress: 1946 on 2007  Progress: 1947 on 2007  Progress: 1948 on 2007  Progress: 1949 on 2007  Progress: 1950 on 2007  Progress: 1951 on 2007  Progress: 1952 on 2007  Progress: 1953 on 2007  Progress: 1954 on 2007  Progress: 1955 on 2007  Progress: 1956 on 2007  Progress: 1957 on 2007  Progress: 1958 on 2007  Progress: 1959 on 2007  Progress: 1960 on 2007  Progress: 1961 on 2007  Progress: 1962 on 2007  Progress: 1963 on 2007  Progress: 1964 on 2007  Progress: 1965 on 2007  Progress: 1966 on 2007  Progress: 1967 on 2007  Progress: 1968 on 2007  Progress: 1969 on 2007  Progress: 1970 on 2007  Progress: 1971 on 2007  Progress: 1972 on 2007  Progress: 1973 on 2007  Progress: 1974 on 2007  Progress: 1975 on 2007  Progress: 1976 on 2007  Progress: 1977 on 2007  Progress: 1978 on 2007  Progress: 1979 on 2007  Progress: 1980 on 2007  Progress: 1981 on 2007  Progress: 1982 on 2007  Progress: 1983 on 2007  Progress: 1984 on 2007  Progress: 1985 on 2007  Progress: 1986 on 2007  Progress: 1987 on 2007  Progress: 1988 on 2007  Progress: 1989 on 2007  Progress: 1990 on 2007  Progress: 1991 on 2007  Progress: 1992 on 2007  Progress: 1993 on 2007  Progress: 1994 on 2007  Progress: 1995 on 2007  Progress: 1996 on 2007  Progress: 1997 on 2007  Progress: 1998 on 2007  Progress: 1999 on 2007  Progress: 2000 on 2007  Progress: 2001 on 2007  Progress: 2002 on 2007  Progress: 2003 on 2007  Progress: 2004 on 2007  Progress: 2005 on 2007  Progress: 2006 on 2007  Progress: 2007 on 2007  
BN_autor <- BN_autor %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 100 i 245. Porównaj pole autor w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE) %>%
  mutate(nazwa = str_replace_all(str_to_lower(paste(AM_NAZWISKO,AM_IMIE, sep = "")), "\\W", "")) %>%
  left_join(.,PBL_autorzy %>% select(AM_AUTOR_ID,AM_KRYPTONIM,AM_LICZBA_ZAPISOW,nazwa) %>% filter(is.na(AM_KRYPTONIM)),by="nazwa") %>%
  arrange(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,-AM_LICZBA_ZAPISOW)
BN_autor$id_grupy <- cumsum(!duplicated(BN_autor[1:3]))
BN_autor <- BN_autor[!duplicated(BN_autor$id_grupy),] %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE,AM_AUTOR_ID)

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(ZA_TYTUL = paste(`$a`,`$b`,`$n`,`$p`,sep = ""))

za_tytul <- marc_field_245 %>%
  mutate(ZA_TYTUL = paste(`$a`,`$b`,`$n`,`$p`,sep = " "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". ")) %>%
  select(ZA_UWAGI,ZA_TYTUL)

#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_246 <- marc_field_246 %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(X246 = paste(`$a`,`$b`,`$n`,`$p`,sep = "")) %>%
  mutate(X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... ")) %>%
  select(ZA_UWAGI, X246)

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)
#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 9  Progress: 2 on 9  Progress: 3 on 9  Progress: 4 on 9  Progress: 5 on 9  Progress: 6 on 9  Progress: 7 on 9  Progress: 8 on 9  Progress: 9 on 9  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 9  Progress: 2 on 9  Progress: 3 on 9  Progress: 4 on 9  Progress: 5 on 9  Progress: 6 on 9  Progress: 7 on 9  Progress: 8 on 9  Progress: 9 on 9  
BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}
Progress:    1 on 1684  Progress:    2 on 1684  Progress:    3 on 1684  Progress:    4 on 1684  Progress:    5 on 1684  Progress:    6 on 1684  Progress:    7 on 1684  Progress:    8 on 1684  Progress:    9 on 1684  Progress:   10 on 1684  Progress:   11 on 1684  Progress:   12 on 1684  Progress:   13 on 1684  Progress:   14 on 1684  Progress:   15 on 1684  Progress:   16 on 1684  Progress:   17 on 1684  Progress:   18 on 1684  Progress:   19 on 1684  Progress:   20 on 1684  Progress:   21 on 1684  Progress:   22 on 1684  Progress:   23 on 1684  Progress:   24 on 1684  Progress:   25 on 1684  Progress:   26 on 1684  Progress:   27 on 1684  Progress:   28 on 1684  Progress:   29 on 1684  Progress:   30 on 1684  Progress:   31 on 1684  Progress:   32 on 1684  Progress:   33 on 1684  Progress:   34 on 1684  Progress:   35 on 1684  Progress:   36 on 1684  Progress:   37 on 1684  Progress:   38 on 1684  Progress:   39 on 1684  Progress:   40 on 1684  Progress:   41 on 1684  Progress:   42 on 1684  Progress:   43 on 1684  Progress:   44 on 1684  Progress:   45 on 1684  Progress:   46 on 1684  Progress:   47 on 1684  Progress:   48 on 1684  Progress:   49 on 1684  Progress:   50 on 1684  Progress:   51 on 1684  Progress:   52 on 1684  Progress:   53 on 1684  Progress:   54 on 1684  Progress:   55 on 1684  Progress:   56 on 1684  Progress:   57 on 1684  Progress:   58 on 1684  Progress:   59 on 1684  Progress:   60 on 1684  Progress:   61 on 1684  Progress:   62 on 1684  Progress:   63 on 1684  Progress:   64 on 1684  Progress:   65 on 1684  Progress:   66 on 1684  Progress:   67 on 1684  Progress:   68 on 1684  Progress:   69 on 1684  Progress:   70 on 1684  Progress:   71 on 1684  Progress:   72 on 1684  Progress:   73 on 1684  Progress:   74 on 1684  Progress:   75 on 1684  Progress:   76 on 1684  Progress:   77 on 1684  Progress:   78 on 1684  Progress:   79 on 1684  Progress:   80 on 1684  Progress:   81 on 1684  Progress:   82 on 1684  Progress:   83 on 1684  Progress:   84 on 1684  Progress:   85 on 1684  Progress:   86 on 1684  Progress:   87 on 1684  Progress:   88 on 1684  Progress:   89 on 1684  Progress:   90 on 1684  Progress:   91 on 1684  Progress:   92 on 1684  Progress:   93 on 1684  Progress:   94 on 1684  Progress:   95 on 1684  Progress:   96 on 1684  Progress:   97 on 1684  Progress:   98 on 1684  Progress:   99 on 1684  Progress:  100 on 1684  Progress:  101 on 1684  Progress:  102 on 1684  Progress:  103 on 1684  Progress:  104 on 1684  Progress:  105 on 1684  Progress:  106 on 1684  Progress:  107 on 1684  Progress:  108 on 1684  Progress:  109 on 1684  Progress:  110 on 1684  Progress:  111 on 1684  Progress:  112 on 1684  Progress:  113 on 1684  Progress:  114 on 1684  Progress:  115 on 1684  Progress:  116 on 1684  Progress:  117 on 1684  Progress:  118 on 1684  Progress:  119 on 1684  Progress:  120 on 1684  Progress:  121 on 1684  Progress:  122 on 1684  Progress:  123 on 1684  Progress:  124 on 1684  Progress:  125 on 1684  Progress:  126 on 1684  Progress:  127 on 1684  Progress:  128 on 1684  Progress:  129 on 1684  Progress:  130 on 1684  Progress:  131 on 1684  Progress:  132 on 1684  Progress:  133 on 1684  Progress:  134 on 1684  Progress:  135 on 1684  Progress:  136 on 1684  Progress:  137 on 1684  Progress:  138 on 1684  Progress:  139 on 1684  Progress:  140 on 1684  Progress:  141 on 1684  Progress:  142 on 1684  Progress:  143 on 1684  Progress:  144 on 1684  Progress:  145 on 1684  Progress:  146 on 1684  Progress:  147 on 1684  Progress:  148 on 1684  Progress:  149 on 1684  Progress:  150 on 1684  Progress:  151 on 1684  Progress:  152 on 1684  Progress:  153 on 1684  Progress:  154 on 1684  Progress:  155 on 1684  Progress:  156 on 1684  Progress:  157 on 1684  Progress:  158 on 1684  Progress:  159 on 1684  Progress:  160 on 1684  Progress:  161 on 1684  Progress:  162 on 1684  Progress:  163 on 1684  Progress:  164 on 1684  Progress:  165 on 1684  Progress:  166 on 1684  Progress:  167 on 1684  Progress:  168 on 1684  Progress:  169 on 1684  Progress:  170 on 1684  Progress:  171 on 1684  Progress:  172 on 1684  Progress:  173 on 1684  Progress:  174 on 1684  Progress:  175 on 1684  Progress:  176 on 1684  Progress:  177 on 1684  Progress:  178 on 1684  Progress:  179 on 1684  Progress:  180 on 1684  Progress:  181 on 1684  Progress:  182 on 1684  Progress:  183 on 1684  Progress:  184 on 1684  Progress:  185 on 1684  Progress:  186 on 1684  Progress:  187 on 1684  Progress:  188 on 1684  Progress:  189 on 1684  Progress:  190 on 1684  Progress:  191 on 1684  Progress:  192 on 1684  Progress:  193 on 1684  Progress:  194 on 1684  Progress:  195 on 1684  Progress:  196 on 1684  Progress:  197 on 1684  Progress:  198 on 1684  Progress:  199 on 1684  Progress:  200 on 1684  Progress:  201 on 1684  Progress:  202 on 1684  Progress:  203 on 1684  Progress:  204 on 1684  Progress:  205 on 1684  Progress:  206 on 1684  Progress:  207 on 1684  Progress:  208 on 1684  Progress:  209 on 1684  Progress:  210 on 1684  Progress:  211 on 1684  Progress:  212 on 1684  Progress:  213 on 1684  Progress:  214 on 1684  Progress:  215 on 1684  Progress:  216 on 1684  Progress:  217 on 1684  Progress:  218 on 1684  Progress:  219 on 1684  Progress:  220 on 1684  Progress:  221 on 1684  Progress:  222 on 1684  Progress:  223 on 1684  Progress:  224 on 1684  Progress:  225 on 1684  Progress:  226 on 1684  Progress:  227 on 1684  Progress:  228 on 1684  Progress:  229 on 1684  Progress:  230 on 1684  Progress:  231 on 1684  Progress:  232 on 1684  Progress:  233 on 1684  Progress:  234 on 1684  Progress:  235 on 1684  Progress:  236 on 1684  Progress:  237 on 1684  Progress:  238 on 1684  Progress:  239 on 1684  Progress:  240 on 1684  Progress:  241 on 1684  Progress:  242 on 1684  Progress:  243 on 1684  Progress:  244 on 1684  Progress:  245 on 1684  Progress:  246 on 1684  Progress:  247 on 1684  Progress:  248 on 1684  Progress:  249 on 1684  Progress:  250 on 1684  Progress:  251 on 1684  Progress:  252 on 1684  Progress:  253 on 1684  Progress:  254 on 1684  Progress:  255 on 1684  Progress:  256 on 1684  Progress:  257 on 1684  Progress:  258 on 1684  Progress:  259 on 1684  Progress:  260 on 1684  Progress:  261 on 1684  Progress:  262 on 1684  Progress:  263 on 1684  Progress:  264 on 1684  Progress:  265 on 1684  Progress:  266 on 1684  Progress:  267 on 1684  Progress:  268 on 1684  Progress:  269 on 1684  Progress:  270 on 1684  Progress:  271 on 1684  Progress:  272 on 1684  Progress:  273 on 1684  Progress:  274 on 1684  Progress:  275 on 1684  Progress:  276 on 1684  Progress:  277 on 1684  Progress:  278 on 1684  Progress:  279 on 1684  Progress:  280 on 1684  Progress:  281 on 1684  Progress:  282 on 1684  Progress:  283 on 1684  Progress:  284 on 1684  Progress:  285 on 1684  Progress:  286 on 1684  Progress:  287 on 1684  Progress:  288 on 1684  Progress:  289 on 1684  Progress:  290 on 1684  Progress:  291 on 1684  Progress:  292 on 1684  Progress:  293 on 1684  Progress:  294 on 1684  Progress:  295 on 1684  Progress:  296 on 1684  Progress:  297 on 1684  Progress:  298 on 1684  Progress:  299 on 1684  Progress:  300 on 1684  Progress:  301 on 1684  Progress:  302 on 1684  Progress:  303 on 1684  Progress:  304 on 1684  Progress:  305 on 1684  Progress:  306 on 1684  Progress:  307 on 1684  Progress:  308 on 1684  Progress:  309 on 1684  Progress:  310 on 1684  Progress:  311 on 1684  Progress:  312 on 1684  Progress:  313 on 1684  Progress:  314 on 1684  Progress:  315 on 1684  Progress:  316 on 1684  Progress:  317 on 1684  Progress:  318 on 1684  Progress:  319 on 1684  Progress:  320 on 1684  Progress:  321 on 1684  Progress:  322 on 1684  Progress:  323 on 1684  Progress:  324 on 1684  Progress:  325 on 1684  Progress:  326 on 1684  Progress:  327 on 1684  Progress:  328 on 1684  Progress:  329 on 1684  Progress:  330 on 1684  Progress:  331 on 1684  Progress:  332 on 1684  Progress:  333 on 1684  Progress:  334 on 1684  Progress:  335 on 1684  Progress:  336 on 1684  Progress:  337 on 1684  Progress:  338 on 1684  Progress:  339 on 1684  Progress:  340 on 1684  Progress:  341 on 1684  Progress:  342 on 1684  Progress:  343 on 1684  Progress:  344 on 1684  Progress:  345 on 1684  Progress:  346 on 1684  Progress:  347 on 1684  Progress:  348 on 1684  Progress:  349 on 1684  Progress:  350 on 1684  Progress:  351 on 1684  Progress:  352 on 1684  Progress:  353 on 1684  Progress:  354 on 1684  Progress:  355 on 1684  Progress:  356 on 1684  Progress:  357 on 1684  Progress:  358 on 1684  Progress:  359 on 1684  Progress:  360 on 1684  Progress:  361 on 1684  Progress:  362 on 1684  Progress:  363 on 1684  Progress:  364 on 1684  Progress:  365 on 1684  Progress:  366 on 1684  Progress:  367 on 1684  Progress:  368 on 1684  Progress:  369 on 1684  Progress:  370 on 1684  Progress:  371 on 1684  Progress:  372 on 1684  Progress:  373 on 1684  Progress:  374 on 1684  Progress:  375 on 1684  Progress:  376 on 1684  Progress:  377 on 1684  Progress:  378 on 1684  Progress:  379 on 1684  Progress:  380 on 1684  Progress:  381 on 1684  Progress:  382 on 1684  Progress:  383 on 1684  Progress:  384 on 1684  Progress:  385 on 1684  Progress:  386 on 1684  Progress:  387 on 1684  Progress:  388 on 1684  Progress:  389 on 1684  Progress:  390 on 1684  Progress:  391 on 1684  Progress:  392 on 1684  Progress:  393 on 1684  Progress:  394 on 1684  Progress:  395 on 1684  Progress:  396 on 1684  Progress:  397 on 1684  Progress:  398 on 1684  Progress:  399 on 1684  Progress:  400 on 1684  Progress:  401 on 1684  Progress:  402 on 1684  Progress:  403 on 1684  Progress:  404 on 1684  Progress:  405 on 1684  Progress:  406 on 1684  Progress:  407 on 1684  Progress:  408 on 1684  Progress:  409 on 1684  Progress:  410 on 1684  Progress:  411 on 1684  Progress:  412 on 1684  Progress:  413 on 1684  Progress:  414 on 1684  Progress:  415 on 1684  Progress:  416 on 1684  Progress:  417 on 1684  Progress:  418 on 1684  Progress:  419 on 1684  Progress:  420 on 1684  Progress:  421 on 1684  Progress:  422 on 1684  Progress:  423 on 1684  Progress:  424 on 1684  Progress:  425 on 1684  Progress:  426 on 1684  Progress:  427 on 1684  Progress:  428 on 1684  Progress:  429 on 1684  Progress:  430 on 1684  Progress:  431 on 1684  Progress:  432 on 1684  Progress:  433 on 1684  Progress:  434 on 1684  Progress:  435 on 1684  Progress:  436 on 1684  Progress:  437 on 1684  Progress:  438 on 1684  Progress:  439 on 1684  Progress:  440 on 1684  Progress:  441 on 1684  Progress:  442 on 1684  Progress:  443 on 1684  Progress:  444 on 1684  Progress:  445 on 1684  Progress:  446 on 1684  Progress:  447 on 1684  Progress:  448 on 1684  Progress:  449 on 1684  Progress:  450 on 1684  Progress:  451 on 1684  Progress:  452 on 1684  Progress:  453 on 1684  Progress:  454 on 1684  Progress:  455 on 1684  Progress:  456 on 1684  Progress:  457 on 1684  Progress:  458 on 1684  Progress:  459 on 1684  Progress:  460 on 1684  Progress:  461 on 1684  Progress:  462 on 1684  Progress:  463 on 1684  Progress:  464 on 1684  Progress:  465 on 1684  Progress:  466 on 1684  Progress:  467 on 1684  Progress:  468 on 1684  Progress:  469 on 1684  Progress:  470 on 1684  Progress:  471 on 1684  Progress:  472 on 1684  Progress:  473 on 1684  Progress:  474 on 1684  Progress:  475 on 1684  Progress:  476 on 1684  Progress:  477 on 1684  Progress:  478 on 1684  Progress:  479 on 1684  Progress:  480 on 1684  Progress:  481 on 1684  Progress:  482 on 1684  Progress:  483 on 1684  Progress:  484 on 1684  Progress:  485 on 1684  Progress:  486 on 1684  Progress:  487 on 1684  Progress:  488 on 1684  Progress:  489 on 1684  Progress:  490 on 1684  Progress:  491 on 1684  Progress:  492 on 1684  Progress:  493 on 1684  Progress:  494 on 1684  Progress:  495 on 1684  Progress:  496 on 1684  Progress:  497 on 1684  Progress:  498 on 1684  Progress:  499 on 1684  Progress:  500 on 1684  Progress:  501 on 1684  Progress:  502 on 1684  Progress:  503 on 1684  Progress:  504 on 1684  Progress:  505 on 1684  Progress:  506 on 1684  Progress:  507 on 1684  Progress:  508 on 1684  Progress:  509 on 1684  Progress:  510 on 1684  Progress:  511 on 1684  Progress:  512 on 1684  Progress:  513 on 1684  Progress:  514 on 1684  Progress:  515 on 1684  Progress:  516 on 1684  Progress:  517 on 1684  Progress:  518 on 1684  Progress:  519 on 1684  Progress:  520 on 1684  Progress:  521 on 1684  Progress:  522 on 1684  Progress:  523 on 1684  Progress:  524 on 1684  Progress:  525 on 1684  Progress:  526 on 1684  Progress:  527 on 1684  Progress:  528 on 1684  Progress:  529 on 1684  Progress:  530 on 1684  Progress:  531 on 1684  Progress:  532 on 1684  Progress:  533 on 1684  Progress:  534 on 1684  Progress:  535 on 1684  Progress:  536 on 1684  Progress:  537 on 1684  Progress:  538 on 1684  Progress:  539 on 1684  Progress:  540 on 1684  Progress:  541 on 1684  Progress:  542 on 1684  Progress:  543 on 1684  Progress:  544 on 1684  Progress:  545 on 1684  Progress:  546 on 1684  Progress:  547 on 1684  Progress:  548 on 1684  Progress:  549 on 1684  Progress:  550 on 1684  Progress:  551 on 1684  Progress:  552 on 1684  Progress:  553 on 1684  Progress:  554 on 1684  Progress:  555 on 1684  Progress:  556 on 1684  Progress:  557 on 1684  Progress:  558 on 1684  Progress:  559 on 1684  Progress:  560 on 1684  Progress:  561 on 1684  Progress:  562 on 1684  Progress:  563 on 1684  Progress:  564 on 1684  Progress:  565 on 1684  Progress:  566 on 1684  Progress:  567 on 1684  Progress:  568 on 1684  Progress:  569 on 1684  Progress:  570 on 1684  Progress:  571 on 1684  Progress:  572 on 1684  Progress:  573 on 1684  Progress:  574 on 1684  Progress:  575 on 1684  Progress:  576 on 1684  Progress:  577 on 1684  Progress:  578 on 1684  Progress:  579 on 1684  Progress:  580 on 1684  Progress:  581 on 1684  Progress:  582 on 1684  Progress:  583 on 1684  Progress:  584 on 1684  Progress:  585 on 1684  Progress:  586 on 1684  Progress:  587 on 1684  Progress:  588 on 1684  Progress:  589 on 1684  Progress:  590 on 1684  Progress:  591 on 1684  Progress:  592 on 1684  Progress:  593 on 1684  Progress:  594 on 1684  Progress:  595 on 1684  Progress:  596 on 1684  Progress:  597 on 1684  Progress:  598 on 1684  Progress:  599 on 1684  Progress:  600 on 1684  Progress:  601 on 1684  Progress:  602 on 1684  Progress:  603 on 1684  Progress:  604 on 1684  Progress:  605 on 1684  Progress:  606 on 1684  Progress:  607 on 1684  Progress:  608 on 1684  Progress:  609 on 1684  Progress:  610 on 1684  Progress:  611 on 1684  Progress:  612 on 1684  Progress:  613 on 1684  Progress:  614 on 1684  Progress:  615 on 1684  Progress:  616 on 1684  Progress:  617 on 1684  Progress:  618 on 1684  Progress:  619 on 1684  Progress:  620 on 1684  Progress:  621 on 1684  Progress:  622 on 1684  Progress:  623 on 1684  Progress:  624 on 1684  Progress:  625 on 1684  Progress:  626 on 1684  Progress:  627 on 1684  Progress:  628 on 1684  Progress:  629 on 1684  Progress:  630 on 1684  Progress:  631 on 1684  Progress:  632 on 1684  Progress:  633 on 1684  Progress:  634 on 1684  Progress:  635 on 1684  Progress:  636 on 1684  Progress:  637 on 1684  Progress:  638 on 1684  Progress:  639 on 1684  Progress:  640 on 1684  Progress:  641 on 1684  Progress:  642 on 1684  Progress:  643 on 1684  Progress:  644 on 1684  Progress:  645 on 1684  Progress:  646 on 1684  Progress:  647 on 1684  Progress:  648 on 1684  Progress:  649 on 1684  Progress:  650 on 1684  Progress:  651 on 1684  Progress:  652 on 1684  Progress:  653 on 1684  Progress:  654 on 1684  Progress:  655 on 1684  Progress:  656 on 1684  Progress:  657 on 1684  Progress:  658 on 1684  Progress:  659 on 1684  Progress:  660 on 1684  Progress:  661 on 1684  Progress:  662 on 1684  Progress:  663 on 1684  Progress:  664 on 1684  Progress:  665 on 1684  Progress:  666 on 1684  Progress:  667 on 1684  Progress:  668 on 1684  Progress:  669 on 1684  Progress:  670 on 1684  Progress:  671 on 1684  Progress:  672 on 1684  Progress:  673 on 1684  Progress:  674 on 1684  Progress:  675 on 1684  Progress:  676 on 1684  Progress:  677 on 1684  Progress:  678 on 1684  Progress:  679 on 1684  Progress:  680 on 1684  Progress:  681 on 1684  Progress:  682 on 1684  Progress:  683 on 1684  Progress:  684 on 1684  Progress:  685 on 1684  Progress:  686 on 1684  Progress:  687 on 1684  Progress:  688 on 1684  Progress:  689 on 1684  Progress:  690 on 1684  Progress:  691 on 1684  Progress:  692 on 1684  Progress:  693 on 1684  Progress:  694 on 1684  Progress:  695 on 1684  Progress:  696 on 1684  Progress:  697 on 1684  Progress:  698 on 1684  Progress:  699 on 1684  Progress:  700 on 1684  Progress:  701 on 1684  Progress:  702 on 1684  Progress:  703 on 1684  Progress:  704 on 1684  Progress:  705 on 1684  Progress:  706 on 1684  Progress:  707 on 1684  Progress:  708 on 1684  Progress:  709 on 1684  Progress:  710 on 1684  Progress:  711 on 1684  Progress:  712 on 1684  Progress:  713 on 1684  Progress:  714 on 1684  Progress:  715 on 1684  Progress:  716 on 1684  Progress:  717 on 1684  Progress:  718 on 1684  Progress:  719 on 1684  Progress:  720 on 1684  Progress:  721 on 1684  Progress:  722 on 1684  Progress:  723 on 1684  Progress:  724 on 1684  Progress:  725 on 1684  Progress:  726 on 1684  Progress:  727 on 1684  Progress:  728 on 1684  Progress:  729 on 1684  Progress:  730 on 1684  Progress:  731 on 1684  Progress:  732 on 1684  Progress:  733 on 1684  Progress:  734 on 1684  Progress:  735 on 1684  Progress:  736 on 1684  Progress:  737 on 1684  Progress:  738 on 1684  Progress:  739 on 1684  Progress:  740 on 1684  Progress:  741 on 1684  Progress:  742 on 1684  Progress:  743 on 1684  Progress:  744 on 1684  Progress:  745 on 1684  Progress:  746 on 1684  Progress:  747 on 1684  Progress:  748 on 1684  Progress:  749 on 1684  Progress:  750 on 1684  Progress:  751 on 1684  Progress:  752 on 1684  Progress:  753 on 1684  Progress:  754 on 1684  Progress:  755 on 1684  Progress:  756 on 1684  Progress:  757 on 1684  Progress:  758 on 1684  Progress:  759 on 1684  Progress:  760 on 1684  Progress:  761 on 1684  Progress:  762 on 1684  Progress:  763 on 1684  Progress:  764 on 1684  Progress:  765 on 1684  Progress:  766 on 1684  Progress:  767 on 1684  Progress:  768 on 1684  Progress:  769 on 1684  Progress:  770 on 1684  Progress:  771 on 1684  Progress:  772 on 1684  Progress:  773 on 1684  Progress:  774 on 1684  Progress:  775 on 1684  Progress:  776 on 1684  Progress:  777 on 1684  Progress:  778 on 1684  Progress:  779 on 1684  Progress:  780 on 1684  Progress:  781 on 1684  Progress:  782 on 1684  Progress:  783 on 1684  Progress:  784 on 1684  Progress:  785 on 1684  Progress:  786 on 1684  Progress:  787 on 1684  Progress:  788 on 1684  Progress:  789 on 1684  Progress:  790 on 1684  Progress:  791 on 1684  Progress:  792 on 1684  Progress:  793 on 1684  Progress:  794 on 1684  Progress:  795 on 1684  Progress:  796 on 1684  Progress:  797 on 1684  Progress:  798 on 1684  Progress:  799 on 1684  Progress:  800 on 1684  Progress:  801 on 1684  Progress:  802 on 1684  Progress:  803 on 1684  Progress:  804 on 1684  Progress:  805 on 1684  Progress:  806 on 1684  Progress:  807 on 1684  Progress:  808 on 1684  Progress:  809 on 1684  Progress:  810 on 1684  Progress:  811 on 1684  Progress:  812 on 1684  Progress:  813 on 1684  Progress:  814 on 1684  Progress:  815 on 1684  Progress:  816 on 1684  Progress:  817 on 1684  Progress:  818 on 1684  Progress:  819 on 1684  Progress:  820 on 1684  Progress:  821 on 1684  Progress:  822 on 1684  Progress:  823 on 1684  Progress:  824 on 1684  Progress:  825 on 1684  Progress:  826 on 1684  Progress:  827 on 1684  Progress:  828 on 1684  Progress:  829 on 1684  Progress:  830 on 1684  Progress:  831 on 1684  Progress:  832 on 1684  Progress:  833 on 1684  Progress:  834 on 1684  Progress:  835 on 1684  Progress:  836 on 1684  Progress:  837 on 1684  Progress:  838 on 1684  Progress:  839 on 1684  Progress:  840 on 1684  Progress:  841 on 1684  Progress:  842 on 1684  Progress:  843 on 1684  Progress:  844 on 1684  Progress:  845 on 1684  Progress:  846 on 1684  Progress:  847 on 1684  Progress:  848 on 1684  Progress:  849 on 1684  Progress:  850 on 1684  Progress:  851 on 1684  Progress:  852 on 1684  Progress:  853 on 1684  Progress:  854 on 1684  Progress:  855 on 1684  Progress:  856 on 1684  Progress:  857 on 1684  Progress:  858 on 1684  Progress:  859 on 1684  Progress:  860 on 1684  Progress:  861 on 1684  Progress:  862 on 1684  Progress:  863 on 1684  Progress:  864 on 1684  Progress:  865 on 1684  Progress:  866 on 1684  Progress:  867 on 1684  Progress:  868 on 1684  Progress:  869 on 1684  Progress:  870 on 1684  Progress:  871 on 1684  Progress:  872 on 1684  Progress:  873 on 1684  Progress:  874 on 1684  Progress:  875 on 1684  Progress:  876 on 1684  Progress:  877 on 1684  Progress:  878 on 1684  Progress:  879 on 1684  Progress:  880 on 1684  Progress:  881 on 1684  Progress:  882 on 1684  Progress:  883 on 1684  Progress:  884 on 1684  Progress:  885 on 1684  Progress:  886 on 1684  Progress:  887 on 1684  Progress:  888 on 1684  Progress:  889 on 1684  Progress:  890 on 1684  Progress:  891 on 1684  Progress:  892 on 1684  Progress:  893 on 1684  Progress:  894 on 1684  Progress:  895 on 1684  Progress:  896 on 1684  Progress:  897 on 1684  Progress:  898 on 1684  Progress:  899 on 1684  Progress:  900 on 1684  Progress:  901 on 1684  Progress:  902 on 1684  Progress:  903 on 1684  Progress:  904 on 1684  Progress:  905 on 1684  Progress:  906 on 1684  Progress:  907 on 1684  Progress:  908 on 1684  Progress:  909 on 1684  Progress:  910 on 1684  Progress:  911 on 1684  Progress:  912 on 1684  Progress:  913 on 1684  Progress:  914 on 1684  Progress:  915 on 1684  Progress:  916 on 1684  Progress:  917 on 1684  Progress:  918 on 1684  Progress:  919 on 1684  Progress:  920 on 1684  Progress:  921 on 1684  Progress:  922 on 1684  Progress:  923 on 1684  Progress:  924 on 1684  Progress:  925 on 1684  Progress:  926 on 1684  Progress:  927 on 1684  Progress:  928 on 1684  Progress:  929 on 1684  Progress:  930 on 1684  Progress:  931 on 1684  Progress:  932 on 1684  Progress:  933 on 1684  Progress:  934 on 1684  Progress:  935 on 1684  Progress:  936 on 1684  Progress:  937 on 1684  Progress:  938 on 1684  Progress:  939 on 1684  Progress:  940 on 1684  Progress:  941 on 1684  Progress:  942 on 1684  Progress:  943 on 1684  Progress:  944 on 1684  Progress:  945 on 1684  Progress:  946 on 1684  Progress:  947 on 1684  Progress:  948 on 1684  Progress:  949 on 1684  Progress:  950 on 1684  Progress:  951 on 1684  Progress:  952 on 1684  Progress:  953 on 1684  Progress:  954 on 1684  Progress:  955 on 1684  Progress:  956 on 1684  Progress:  957 on 1684  Progress:  958 on 1684  Progress:  959 on 1684  Progress:  960 on 1684  Progress:  961 on 1684  Progress:  962 on 1684  Progress:  963 on 1684  Progress:  964 on 1684  Progress:  965 on 1684  Progress:  966 on 1684  Progress:  967 on 1684  Progress:  968 on 1684  Progress:  969 on 1684  Progress:  970 on 1684  Progress:  971 on 1684  Progress:  972 on 1684  Progress:  973 on 1684  Progress:  974 on 1684  Progress:  975 on 1684  Progress:  976 on 1684  Progress:  977 on 1684  Progress:  978 on 1684  Progress:  979 on 1684  Progress:  980 on 1684  Progress:  981 on 1684  Progress:  982 on 1684  Progress:  983 on 1684  Progress:  984 on 1684  Progress:  985 on 1684  Progress:  986 on 1684  Progress:  987 on 1684  Progress:  988 on 1684  Progress:  989 on 1684  Progress:  990 on 1684  Progress:  991 on 1684  Progress:  992 on 1684  Progress:  993 on 1684  Progress:  994 on 1684  Progress:  995 on 1684  Progress:  996 on 1684  Progress:  997 on 1684  Progress:  998 on 1684  Progress:  999 on 1684  Progress: 1000 on 1684  Progress: 1001 on 1684  Progress: 1002 on 1684  Progress: 1003 on 1684  Progress: 1004 on 1684  Progress: 1005 on 1684  Progress: 1006 on 1684  Progress: 1007 on 1684  Progress: 1008 on 1684  Progress: 1009 on 1684  Progress: 1010 on 1684  Progress: 1011 on 1684  Progress: 1012 on 1684  Progress: 1013 on 1684  Progress: 1014 on 1684  Progress: 1015 on 1684  Progress: 1016 on 1684  Progress: 1017 on 1684  Progress: 1018 on 1684  Progress: 1019 on 1684  Progress: 1020 on 1684  Progress: 1021 on 1684  Progress: 1022 on 1684  Progress: 1023 on 1684  Progress: 1024 on 1684  Progress: 1025 on 1684  Progress: 1026 on 1684  Progress: 1027 on 1684  Progress: 1028 on 1684  Progress: 1029 on 1684  Progress: 1030 on 1684  Progress: 1031 on 1684  Progress: 1032 on 1684  Progress: 1033 on 1684  Progress: 1034 on 1684  Progress: 1035 on 1684  Progress: 1036 on 1684  Progress: 1037 on 1684  Progress: 1038 on 1684  Progress: 1039 on 1684  Progress: 1040 on 1684  Progress: 1041 on 1684  Progress: 1042 on 1684  Progress: 1043 on 1684  Progress: 1044 on 1684  Progress: 1045 on 1684  Progress: 1046 on 1684  Progress: 1047 on 1684  Progress: 1048 on 1684  Progress: 1049 on 1684  Progress: 1050 on 1684  Progress: 1051 on 1684  Progress: 1052 on 1684  Progress: 1053 on 1684  Progress: 1054 on 1684  Progress: 1055 on 1684  Progress: 1056 on 1684  Progress: 1057 on 1684  Progress: 1058 on 1684  Progress: 1059 on 1684  Progress: 1060 on 1684  Progress: 1061 on 1684  Progress: 1062 on 1684  Progress: 1063 on 1684  Progress: 1064 on 1684  Progress: 1065 on 1684  Progress: 1066 on 1684  Progress: 1067 on 1684  Progress: 1068 on 1684  Progress: 1069 on 1684  Progress: 1070 on 1684  Progress: 1071 on 1684  Progress: 1072 on 1684  Progress: 1073 on 1684  Progress: 1074 on 1684  Progress: 1075 on 1684  Progress: 1076 on 1684  Progress: 1077 on 1684  Progress: 1078 on 1684  Progress: 1079 on 1684  Progress: 1080 on 1684  Progress: 1081 on 1684  Progress: 1082 on 1684  Progress: 1083 on 1684  Progress: 1084 on 1684  Progress: 1085 on 1684  Progress: 1086 on 1684  Progress: 1087 on 1684  Progress: 1088 on 1684  Progress: 1089 on 1684  Progress: 1090 on 1684  Progress: 1091 on 1684  Progress: 1092 on 1684  Progress: 1093 on 1684  Progress: 1094 on 1684  Progress: 1095 on 1684  Progress: 1096 on 1684  Progress: 1097 on 1684  Progress: 1098 on 1684  Progress: 1099 on 1684  Progress: 1100 on 1684  Progress: 1101 on 1684  Progress: 1102 on 1684  Progress: 1103 on 1684  Progress: 1104 on 1684  Progress: 1105 on 1684  Progress: 1106 on 1684  Progress: 1107 on 1684  Progress: 1108 on 1684  Progress: 1109 on 1684  Progress: 1110 on 1684  Progress: 1111 on 1684  Progress: 1112 on 1684  Progress: 1113 on 1684  Progress: 1114 on 1684  Progress: 1115 on 1684  Progress: 1116 on 1684  Progress: 1117 on 1684  Progress: 1118 on 1684  Progress: 1119 on 1684  Progress: 1120 on 1684  Progress: 1121 on 1684  Progress: 1122 on 1684  Progress: 1123 on 1684  Progress: 1124 on 1684  Progress: 1125 on 1684  Progress: 1126 on 1684  Progress: 1127 on 1684  Progress: 1128 on 1684  Progress: 1129 on 1684  Progress: 1130 on 1684  Progress: 1131 on 1684  Progress: 1132 on 1684  Progress: 1133 on 1684  Progress: 1134 on 1684  Progress: 1135 on 1684  Progress: 1136 on 1684  Progress: 1137 on 1684  Progress: 1138 on 1684  Progress: 1139 on 1684  Progress: 1140 on 1684  Progress: 1141 on 1684  Progress: 1142 on 1684  Progress: 1143 on 1684  Progress: 1144 on 1684  Progress: 1145 on 1684  Progress: 1146 on 1684  Progress: 1147 on 1684  Progress: 1148 on 1684  Progress: 1149 on 1684  Progress: 1150 on 1684  Progress: 1151 on 1684  Progress: 1152 on 1684  Progress: 1153 on 1684  Progress: 1154 on 1684  Progress: 1155 on 1684  Progress: 1156 on 1684  Progress: 1157 on 1684  Progress: 1158 on 1684  Progress: 1159 on 1684  Progress: 1160 on 1684  Progress: 1161 on 1684  Progress: 1162 on 1684  Progress: 1163 on 1684  Progress: 1164 on 1684  Progress: 1165 on 1684  Progress: 1166 on 1684  Progress: 1167 on 1684  Progress: 1168 on 1684  Progress: 1169 on 1684  Progress: 1170 on 1684  Progress: 1171 on 1684  Progress: 1172 on 1684  Progress: 1173 on 1684  Progress: 1174 on 1684  Progress: 1175 on 1684  Progress: 1176 on 1684  Progress: 1177 on 1684  Progress: 1178 on 1684  Progress: 1179 on 1684  Progress: 1180 on 1684  Progress: 1181 on 1684  Progress: 1182 on 1684  Progress: 1183 on 1684  Progress: 1184 on 1684  Progress: 1185 on 1684  Progress: 1186 on 1684  Progress: 1187 on 1684  Progress: 1188 on 1684  Progress: 1189 on 1684  Progress: 1190 on 1684  Progress: 1191 on 1684  Progress: 1192 on 1684  Progress: 1193 on 1684  Progress: 1194 on 1684  Progress: 1195 on 1684  Progress: 1196 on 1684  Progress: 1197 on 1684  Progress: 1198 on 1684  Progress: 1199 on 1684  Progress: 1200 on 1684  Progress: 1201 on 1684  Progress: 1202 on 1684  Progress: 1203 on 1684  Progress: 1204 on 1684  Progress: 1205 on 1684  Progress: 1206 on 1684  Progress: 1207 on 1684  Progress: 1208 on 1684  Progress: 1209 on 1684  Progress: 1210 on 1684  Progress: 1211 on 1684  Progress: 1212 on 1684  Progress: 1213 on 1684  Progress: 1214 on 1684  Progress: 1215 on 1684  Progress: 1216 on 1684  Progress: 1217 on 1684  Progress: 1218 on 1684  Progress: 1219 on 1684  Progress: 1220 on 1684  Progress: 1221 on 1684  Progress: 1222 on 1684  Progress: 1223 on 1684  Progress: 1224 on 1684  Progress: 1225 on 1684  Progress: 1226 on 1684  Progress: 1227 on 1684  Progress: 1228 on 1684  Progress: 1229 on 1684  Progress: 1230 on 1684  Progress: 1231 on 1684  Progress: 1232 on 1684  Progress: 1233 on 1684  Progress: 1234 on 1684  Progress: 1235 on 1684  Progress: 1236 on 1684  Progress: 1237 on 1684  Progress: 1238 on 1684  Progress: 1239 on 1684  Progress: 1240 on 1684  Progress: 1241 on 1684  Progress: 1242 on 1684  Progress: 1243 on 1684  Progress: 1244 on 1684  Progress: 1245 on 1684  Progress: 1246 on 1684  Progress: 1247 on 1684  Progress: 1248 on 1684  Progress: 1249 on 1684  Progress: 1250 on 1684  Progress: 1251 on 1684  Progress: 1252 on 1684  Progress: 1253 on 1684  Progress: 1254 on 1684  Progress: 1255 on 1684  Progress: 1256 on 1684  Progress: 1257 on 1684  Progress: 1258 on 1684  Progress: 1259 on 1684  Progress: 1260 on 1684  Progress: 1261 on 1684  Progress: 1262 on 1684  Progress: 1263 on 1684  Progress: 1264 on 1684  Progress: 1265 on 1684  Progress: 1266 on 1684  Progress: 1267 on 1684  Progress: 1268 on 1684  Progress: 1269 on 1684  Progress: 1270 on 1684  Progress: 1271 on 1684  Progress: 1272 on 1684  Progress: 1273 on 1684  Progress: 1274 on 1684  Progress: 1275 on 1684  Progress: 1276 on 1684  Progress: 1277 on 1684  Progress: 1278 on 1684  Progress: 1279 on 1684  Progress: 1280 on 1684  Progress: 1281 on 1684  Progress: 1282 on 1684  Progress: 1283 on 1684  Progress: 1284 on 1684  Progress: 1285 on 1684  Progress: 1286 on 1684  Progress: 1287 on 1684  Progress: 1288 on 1684  Progress: 1289 on 1684  Progress: 1290 on 1684  Progress: 1291 on 1684  Progress: 1292 on 1684  Progress: 1293 on 1684  Progress: 1294 on 1684  Progress: 1295 on 1684  Progress: 1296 on 1684  Progress: 1297 on 1684  Progress: 1298 on 1684  Progress: 1299 on 1684  Progress: 1300 on 1684  Progress: 1301 on 1684  Progress: 1302 on 1684  Progress: 1303 on 1684  Progress: 1304 on 1684  Progress: 1305 on 1684  Progress: 1306 on 1684  Progress: 1307 on 1684  Progress: 1308 on 1684  Progress: 1309 on 1684  Progress: 1310 on 1684  Progress: 1311 on 1684  Progress: 1312 on 1684  Progress: 1313 on 1684  Progress: 1314 on 1684  Progress: 1315 on 1684  Progress: 1316 on 1684  Progress: 1317 on 1684  Progress: 1318 on 1684  Progress: 1319 on 1684  Progress: 1320 on 1684  Progress: 1321 on 1684  Progress: 1322 on 1684  Progress: 1323 on 1684  Progress: 1324 on 1684  Progress: 1325 on 1684  Progress: 1326 on 1684  Progress: 1327 on 1684  Progress: 1328 on 1684  Progress: 1329 on 1684  Progress: 1330 on 1684  Progress: 1331 on 1684  Progress: 1332 on 1684  Progress: 1333 on 1684  Progress: 1334 on 1684  Progress: 1335 on 1684  Progress: 1336 on 1684  Progress: 1337 on 1684  Progress: 1338 on 1684  Progress: 1339 on 1684  Progress: 1340 on 1684  Progress: 1341 on 1684  Progress: 1342 on 1684  Progress: 1343 on 1684  Progress: 1344 on 1684  Progress: 1345 on 1684  Progress: 1346 on 1684  Progress: 1347 on 1684  Progress: 1348 on 1684  Progress: 1349 on 1684  Progress: 1350 on 1684  Progress: 1351 on 1684  Progress: 1352 on 1684  Progress: 1353 on 1684  Progress: 1354 on 1684  Progress: 1355 on 1684  Progress: 1356 on 1684  Progress: 1357 on 1684  Progress: 1358 on 1684  Progress: 1359 on 1684  Progress: 1360 on 1684  Progress: 1361 on 1684  Progress: 1362 on 1684  Progress: 1363 on 1684  Progress: 1364 on 1684  Progress: 1365 on 1684  Progress: 1366 on 1684  Progress: 1367 on 1684  Progress: 1368 on 1684  Progress: 1369 on 1684  Progress: 1370 on 1684  Progress: 1371 on 1684  Progress: 1372 on 1684  Progress: 1373 on 1684  Progress: 1374 on 1684  Progress: 1375 on 1684  Progress: 1376 on 1684  Progress: 1377 on 1684  Progress: 1378 on 1684  Progress: 1379 on 1684  Progress: 1380 on 1684  Progress: 1381 on 1684  Progress: 1382 on 1684  Progress: 1383 on 1684  Progress: 1384 on 1684  Progress: 1385 on 1684  Progress: 1386 on 1684  Progress: 1387 on 1684  Progress: 1388 on 1684  Progress: 1389 on 1684  Progress: 1390 on 1684  Progress: 1391 on 1684  Progress: 1392 on 1684  Progress: 1393 on 1684  Progress: 1394 on 1684  Progress: 1395 on 1684  Progress: 1396 on 1684  Progress: 1397 on 1684  Progress: 1398 on 1684  Progress: 1399 on 1684  Progress: 1400 on 1684  Progress: 1401 on 1684  Progress: 1402 on 1684  Progress: 1403 on 1684  Progress: 1404 on 1684  Progress: 1405 on 1684  Progress: 1406 on 1684  Progress: 1407 on 1684  Progress: 1408 on 1684  Progress: 1409 on 1684  Progress: 1410 on 1684  Progress: 1411 on 1684  Progress: 1412 on 1684  Progress: 1413 on 1684  Progress: 1414 on 1684  Progress: 1415 on 1684  Progress: 1416 on 1684  Progress: 1417 on 1684  Progress: 1418 on 1684  Progress: 1419 on 1684  Progress: 1420 on 1684  Progress: 1421 on 1684  Progress: 1422 on 1684  Progress: 1423 on 1684  Progress: 1424 on 1684  Progress: 1425 on 1684  Progress: 1426 on 1684  Progress: 1427 on 1684  Progress: 1428 on 1684  Progress: 1429 on 1684  Progress: 1430 on 1684  Progress: 1431 on 1684  Progress: 1432 on 1684  Progress: 1433 on 1684  Progress: 1434 on 1684  Progress: 1435 on 1684  Progress: 1436 on 1684  Progress: 1437 on 1684  Progress: 1438 on 1684  Progress: 1439 on 1684  Progress: 1440 on 1684  Progress: 1441 on 1684  Progress: 1442 on 1684  Progress: 1443 on 1684  Progress: 1444 on 1684  Progress: 1445 on 1684  Progress: 1446 on 1684  Progress: 1447 on 1684  Progress: 1448 on 1684  Progress: 1449 on 1684  Progress: 1450 on 1684  Progress: 1451 on 1684  Progress: 1452 on 1684  Progress: 1453 on 1684  Progress: 1454 on 1684  Progress: 1455 on 1684  Progress: 1456 on 1684  Progress: 1457 on 1684  Progress: 1458 on 1684  Progress: 1459 on 1684  Progress: 1460 on 1684  Progress: 1461 on 1684  Progress: 1462 on 1684  Progress: 1463 on 1684  Progress: 1464 on 1684  Progress: 1465 on 1684  Progress: 1466 on 1684  Progress: 1467 on 1684  Progress: 1468 on 1684  Progress: 1469 on 1684  Progress: 1470 on 1684  Progress: 1471 on 1684  Progress: 1472 on 1684  Progress: 1473 on 1684  Progress: 1474 on 1684  Progress: 1475 on 1684  Progress: 1476 on 1684  Progress: 1477 on 1684  Progress: 1478 on 1684  Progress: 1479 on 1684  Progress: 1480 on 1684  Progress: 1481 on 1684  Progress: 1482 on 1684  Progress: 1483 on 1684  Progress: 1484 on 1684  Progress: 1485 on 1684  Progress: 1486 on 1684  Progress: 1487 on 1684  Progress: 1488 on 1684  Progress: 1489 on 1684  Progress: 1490 on 1684  Progress: 1491 on 1684  Progress: 1492 on 1684  Progress: 1493 on 1684  Progress: 1494 on 1684  Progress: 1495 on 1684  Progress: 1496 on 1684  Progress: 1497 on 1684  Progress: 1498 on 1684  Progress: 1499 on 1684  Progress: 1500 on 1684  Progress: 1501 on 1684  Progress: 1502 on 1684  Progress: 1503 on 1684  Progress: 1504 on 1684  Progress: 1505 on 1684  Progress: 1506 on 1684  Progress: 1507 on 1684  Progress: 1508 on 1684  Progress: 1509 on 1684  Progress: 1510 on 1684  Progress: 1511 on 1684  Progress: 1512 on 1684  Progress: 1513 on 1684  Progress: 1514 on 1684  Progress: 1515 on 1684  Progress: 1516 on 1684  Progress: 1517 on 1684  Progress: 1518 on 1684  Progress: 1519 on 1684  Progress: 1520 on 1684  Progress: 1521 on 1684  Progress: 1522 on 1684  Progress: 1523 on 1684  Progress: 1524 on 1684  Progress: 1525 on 1684  Progress: 1526 on 1684  Progress: 1527 on 1684  Progress: 1528 on 1684  Progress: 1529 on 1684  Progress: 1530 on 1684  Progress: 1531 on 1684  Progress: 1532 on 1684  Progress: 1533 on 1684  Progress: 1534 on 1684  Progress: 1535 on 1684  Progress: 1536 on 1684  Progress: 1537 on 1684  Progress: 1538 on 1684  Progress: 1539 on 1684  Progress: 1540 on 1684  Progress: 1541 on 1684  Progress: 1542 on 1684  Progress: 1543 on 1684  Progress: 1544 on 1684  Progress: 1545 on 1684  Progress: 1546 on 1684  Progress: 1547 on 1684  Progress: 1548 on 1684  Progress: 1549 on 1684  Progress: 1550 on 1684  Progress: 1551 on 1684  Progress: 1552 on 1684  Progress: 1553 on 1684  Progress: 1554 on 1684  Progress: 1555 on 1684  Progress: 1556 on 1684  Progress: 1557 on 1684  Progress: 1558 on 1684  Progress: 1559 on 1684  Progress: 1560 on 1684  Progress: 1561 on 1684  Progress: 1562 on 1684  Progress: 1563 on 1684  Progress: 1564 on 1684  Progress: 1565 on 1684  Progress: 1566 on 1684  Progress: 1567 on 1684  Progress: 1568 on 1684  Progress: 1569 on 1684  Progress: 1570 on 1684  Progress: 1571 on 1684  Progress: 1572 on 1684  Progress: 1573 on 1684  Progress: 1574 on 1684  Progress: 1575 on 1684  Progress: 1576 on 1684  Progress: 1577 on 1684  Progress: 1578 on 1684  Progress: 1579 on 1684  Progress: 1580 on 1684  Progress: 1581 on 1684  Progress: 1582 on 1684  Progress: 1583 on 1684  Progress: 1584 on 1684  Progress: 1585 on 1684  Progress: 1586 on 1684  Progress: 1587 on 1684  Progress: 1588 on 1684  Progress: 1589 on 1684  Progress: 1590 on 1684  Progress: 1591 on 1684  Progress: 1592 on 1684  Progress: 1593 on 1684  Progress: 1594 on 1684  Progress: 1595 on 1684  Progress: 1596 on 1684  Progress: 1597 on 1684  Progress: 1598 on 1684  Progress: 1599 on 1684  Progress: 1600 on 1684  Progress: 1601 on 1684  Progress: 1602 on 1684  Progress: 1603 on 1684  Progress: 1604 on 1684  Progress: 1605 on 1684  Progress: 1606 on 1684  Progress: 1607 on 1684  Progress: 1608 on 1684  Progress: 1609 on 1684  Progress: 1610 on 1684  Progress: 1611 on 1684  Progress: 1612 on 1684  Progress: 1613 on 1684  Progress: 1614 on 1684  Progress: 1615 on 1684  Progress: 1616 on 1684  Progress: 1617 on 1684  Progress: 1618 on 1684  Progress: 1619 on 1684  Progress: 1620 on 1684  Progress: 1621 on 1684  Progress: 1622 on 1684  Progress: 1623 on 1684  Progress: 1624 on 1684  Progress: 1625 on 1684  Progress: 1626 on 1684  Progress: 1627 on 1684  Progress: 1628 on 1684  Progress: 1629 on 1684  Progress: 1630 on 1684  Progress: 1631 on 1684  Progress: 1632 on 1684  Progress: 1633 on 1684  Progress: 1634 on 1684  Progress: 1635 on 1684  Progress: 1636 on 1684  Progress: 1637 on 1684  Progress: 1638 on 1684  Progress: 1639 on 1684  Progress: 1640 on 1684  Progress: 1641 on 1684  Progress: 1642 on 1684  Progress: 1643 on 1684  Progress: 1644 on 1684  Progress: 1645 on 1684  Progress: 1646 on 1684  Progress: 1647 on 1684  Progress: 1648 on 1684  Progress: 1649 on 1684  Progress: 1650 on 1684  Progress: 1651 on 1684  Progress: 1652 on 1684  Progress: 1653 on 1684  Progress: 1654 on 1684  Progress: 1655 on 1684  Progress: 1656 on 1684  Progress: 1657 on 1684  Progress: 1658 on 1684  Progress: 1659 on 1684  Progress: 1660 on 1684  Progress: 1661 on 1684  Progress: 1662 on 1684  Progress: 1663 on 1684  Progress: 1664 on 1684  Progress: 1665 on 1684  Progress: 1666 on 1684  Progress: 1667 on 1684  Progress: 1668 on 1684  Progress: 1669 on 1684  Progress: 1670 on 1684  Progress: 1671 on 1684  Progress: 1672 on 1684  Progress: 1673 on 1684  Progress: 1674 on 1684  Progress: 1675 on 1684  Progress: 1676 on 1684  Progress: 1677 on 1684  Progress: 1678 on 1684  Progress: 1679 on 1684  Progress: 1680 on 1684  Progress: 1681 on 1684  Progress: 1682 on 1684  Progress: 1683 on 1684  Progress: 1684 on 1684  
BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 9  Progress: 2 on 9  Progress: 3 on 9  Progress: 4 on 9  Progress: 5 on 9  Progress: 6 on 9  Progress: 7 on 9  Progress: 8 on 9  Progress: 9 on 9  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 9  Progress: 2 on 9  Progress: 3 on 9  Progress: 4 on 9  Progress: 5 on 9  Progress: 6 on 9  Progress: 7 on 9  Progress: 8 on 9  Progress: 9 on 9  
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}
Progress:    1 on 2677  Progress:    2 on 2677  Progress:    3 on 2677  Progress:    4 on 2677  Progress:    5 on 2677  Progress:    6 on 2677  Progress:    7 on 2677  Progress:    8 on 2677  Progress:    9 on 2677  Progress:   10 on 2677  Progress:   11 on 2677  Progress:   12 on 2677  Progress:   13 on 2677  Progress:   14 on 2677  Progress:   15 on 2677  Progress:   16 on 2677  Progress:   17 on 2677  Progress:   18 on 2677  Progress:   19 on 2677  Progress:   20 on 2677  Progress:   21 on 2677  Progress:   22 on 2677  Progress:   23 on 2677  Progress:   24 on 2677  Progress:   25 on 2677  Progress:   26 on 2677  Progress:   27 on 2677  Progress:   28 on 2677  Progress:   29 on 2677  Progress:   30 on 2677  Progress:   31 on 2677  Progress:   32 on 2677  Progress:   33 on 2677  Progress:   34 on 2677  Progress:   35 on 2677  Progress:   36 on 2677  Progress:   37 on 2677  Progress:   38 on 2677  Progress:   39 on 2677  Progress:   40 on 2677  Progress:   41 on 2677  Progress:   42 on 2677  Progress:   43 on 2677  Progress:   44 on 2677  Progress:   45 on 2677  Progress:   46 on 2677  Progress:   47 on 2677  Progress:   48 on 2677  Progress:   49 on 2677  Progress:   50 on 2677  Progress:   51 on 2677  Progress:   52 on 2677  Progress:   53 on 2677  Progress:   54 on 2677  Progress:   55 on 2677  Progress:   56 on 2677  Progress:   57 on 2677  Progress:   58 on 2677  Progress:   59 on 2677  Progress:   60 on 2677  Progress:   61 on 2677  Progress:   62 on 2677  Progress:   63 on 2677  Progress:   64 on 2677  Progress:   65 on 2677  Progress:   66 on 2677  Progress:   67 on 2677  Progress:   68 on 2677  Progress:   69 on 2677  Progress:   70 on 2677  Progress:   71 on 2677  Progress:   72 on 2677  Progress:   73 on 2677  Progress:   74 on 2677  Progress:   75 on 2677  Progress:   76 on 2677  Progress:   77 on 2677  Progress:   78 on 2677  Progress:   79 on 2677  Progress:   80 on 2677  Progress:   81 on 2677  Progress:   82 on 2677  Progress:   83 on 2677  Progress:   84 on 2677  Progress:   85 on 2677  Progress:   86 on 2677  Progress:   87 on 2677  Progress:   88 on 2677  Progress:   89 on 2677  Progress:   90 on 2677  Progress:   91 on 2677  Progress:   92 on 2677  Progress:   93 on 2677  Progress:   94 on 2677  Progress:   95 on 2677  Progress:   96 on 2677  Progress:   97 on 2677  Progress:   98 on 2677  Progress:   99 on 2677  Progress:  100 on 2677  Progress:  101 on 2677  Progress:  102 on 2677  Progress:  103 on 2677  Progress:  104 on 2677  Progress:  105 on 2677  Progress:  106 on 2677  Progress:  107 on 2677  Progress:  108 on 2677  Progress:  109 on 2677  Progress:  110 on 2677  Progress:  111 on 2677  Progress:  112 on 2677  Progress:  113 on 2677  Progress:  114 on 2677  Progress:  115 on 2677  Progress:  116 on 2677  Progress:  117 on 2677  Progress:  118 on 2677  Progress:  119 on 2677  Progress:  120 on 2677  Progress:  121 on 2677  Progress:  122 on 2677  Progress:  123 on 2677  Progress:  124 on 2677  Progress:  125 on 2677  Progress:  126 on 2677  Progress:  127 on 2677  Progress:  128 on 2677  Progress:  129 on 2677  Progress:  130 on 2677  Progress:  131 on 2677  Progress:  132 on 2677  Progress:  133 on 2677  Progress:  134 on 2677  Progress:  135 on 2677  Progress:  136 on 2677  Progress:  137 on 2677  Progress:  138 on 2677  Progress:  139 on 2677  Progress:  140 on 2677  Progress:  141 on 2677  Progress:  142 on 2677  Progress:  143 on 2677  Progress:  144 on 2677  Progress:  145 on 2677  Progress:  146 on 2677  Progress:  147 on 2677  Progress:  148 on 2677  Progress:  149 on 2677  Progress:  150 on 2677  Progress:  151 on 2677  Progress:  152 on 2677  Progress:  153 on 2677  Progress:  154 on 2677  Progress:  155 on 2677  Progress:  156 on 2677  Progress:  157 on 2677  Progress:  158 on 2677  Progress:  159 on 2677  Progress:  160 on 2677  Progress:  161 on 2677  Progress:  162 on 2677  Progress:  163 on 2677  Progress:  164 on 2677  Progress:  165 on 2677  Progress:  166 on 2677  Progress:  167 on 2677  Progress:  168 on 2677  Progress:  169 on 2677  Progress:  170 on 2677  Progress:  171 on 2677  Progress:  172 on 2677  Progress:  173 on 2677  Progress:  174 on 2677  Progress:  175 on 2677  Progress:  176 on 2677  Progress:  177 on 2677  Progress:  178 on 2677  Progress:  179 on 2677  Progress:  180 on 2677  Progress:  181 on 2677  Progress:  182 on 2677  Progress:  183 on 2677  Progress:  184 on 2677  Progress:  185 on 2677  Progress:  186 on 2677  Progress:  187 on 2677  Progress:  188 on 2677  Progress:  189 on 2677  Progress:  190 on 2677  Progress:  191 on 2677  Progress:  192 on 2677  Progress:  193 on 2677  Progress:  194 on 2677  Progress:  195 on 2677  Progress:  196 on 2677  Progress:  197 on 2677  Progress:  198 on 2677  Progress:  199 on 2677  Progress:  200 on 2677  Progress:  201 on 2677  Progress:  202 on 2677  Progress:  203 on 2677  Progress:  204 on 2677  Progress:  205 on 2677  Progress:  206 on 2677  Progress:  207 on 2677  Progress:  208 on 2677  Progress:  209 on 2677  Progress:  210 on 2677  Progress:  211 on 2677  Progress:  212 on 2677  Progress:  213 on 2677  Progress:  214 on 2677  Progress:  215 on 2677  Progress:  216 on 2677  Progress:  217 on 2677  Progress:  218 on 2677  Progress:  219 on 2677  Progress:  220 on 2677  Progress:  221 on 2677  Progress:  222 on 2677  Progress:  223 on 2677  Progress:  224 on 2677  Progress:  225 on 2677  Progress:  226 on 2677  Progress:  227 on 2677  Progress:  228 on 2677  Progress:  229 on 2677  Progress:  230 on 2677  Progress:  231 on 2677  Progress:  232 on 2677  Progress:  233 on 2677  Progress:  234 on 2677  Progress:  235 on 2677  Progress:  236 on 2677  Progress:  237 on 2677  Progress:  238 on 2677  Progress:  239 on 2677  Progress:  240 on 2677  Progress:  241 on 2677  Progress:  242 on 2677  Progress:  243 on 2677  Progress:  244 on 2677  Progress:  245 on 2677  Progress:  246 on 2677  Progress:  247 on 2677  Progress:  248 on 2677  Progress:  249 on 2677  Progress:  250 on 2677  Progress:  251 on 2677  Progress:  252 on 2677  Progress:  253 on 2677  Progress:  254 on 2677  Progress:  255 on 2677  Progress:  256 on 2677  Progress:  257 on 2677  Progress:  258 on 2677  Progress:  259 on 2677  Progress:  260 on 2677  Progress:  261 on 2677  Progress:  262 on 2677  Progress:  263 on 2677  Progress:  264 on 2677  Progress:  265 on 2677  Progress:  266 on 2677  Progress:  267 on 2677  Progress:  268 on 2677  Progress:  269 on 2677  Progress:  270 on 2677  Progress:  271 on 2677  Progress:  272 on 2677  Progress:  273 on 2677  Progress:  274 on 2677  Progress:  275 on 2677  Progress:  276 on 2677  Progress:  277 on 2677  Progress:  278 on 2677  Progress:  279 on 2677  Progress:  280 on 2677  Progress:  281 on 2677  Progress:  282 on 2677  Progress:  283 on 2677  Progress:  284 on 2677  Progress:  285 on 2677  Progress:  286 on 2677  Progress:  287 on 2677  Progress:  288 on 2677  Progress:  289 on 2677  Progress:  290 on 2677  Progress:  291 on 2677  Progress:  292 on 2677  Progress:  293 on 2677  Progress:  294 on 2677  Progress:  295 on 2677  Progress:  296 on 2677  Progress:  297 on 2677  Progress:  298 on 2677  Progress:  299 on 2677  Progress:  300 on 2677  Progress:  301 on 2677  Progress:  302 on 2677  Progress:  303 on 2677  Progress:  304 on 2677  Progress:  305 on 2677  Progress:  306 on 2677  Progress:  307 on 2677  Progress:  308 on 2677  Progress:  309 on 2677  Progress:  310 on 2677  Progress:  311 on 2677  Progress:  312 on 2677  Progress:  313 on 2677  Progress:  314 on 2677  Progress:  315 on 2677  Progress:  316 on 2677  Progress:  317 on 2677  Progress:  318 on 2677  Progress:  319 on 2677  Progress:  320 on 2677  Progress:  321 on 2677  Progress:  322 on 2677  Progress:  323 on 2677  Progress:  324 on 2677  Progress:  325 on 2677  Progress:  326 on 2677  Progress:  327 on 2677  Progress:  328 on 2677  Progress:  329 on 2677  Progress:  330 on 2677  Progress:  331 on 2677  Progress:  332 on 2677  Progress:  333 on 2677  Progress:  334 on 2677  Progress:  335 on 2677  Progress:  336 on 2677  Progress:  337 on 2677  Progress:  338 on 2677  Progress:  339 on 2677  Progress:  340 on 2677  Progress:  341 on 2677  Progress:  342 on 2677  Progress:  343 on 2677  Progress:  344 on 2677  Progress:  345 on 2677  Progress:  346 on 2677  Progress:  347 on 2677  Progress:  348 on 2677  Progress:  349 on 2677  Progress:  350 on 2677  Progress:  351 on 2677  Progress:  352 on 2677  Progress:  353 on 2677  Progress:  354 on 2677  Progress:  355 on 2677  Progress:  356 on 2677  Progress:  357 on 2677  Progress:  358 on 2677  Progress:  359 on 2677  Progress:  360 on 2677  Progress:  361 on 2677  Progress:  362 on 2677  Progress:  363 on 2677  Progress:  364 on 2677  Progress:  365 on 2677  Progress:  366 on 2677  Progress:  367 on 2677  Progress:  368 on 2677  Progress:  369 on 2677  Progress:  370 on 2677  Progress:  371 on 2677  Progress:  372 on 2677  Progress:  373 on 2677  Progress:  374 on 2677  Progress:  375 on 2677  Progress:  376 on 2677  Progress:  377 on 2677  Progress:  378 on 2677  Progress:  379 on 2677  Progress:  380 on 2677  Progress:  381 on 2677  Progress:  382 on 2677  Progress:  383 on 2677  Progress:  384 on 2677  Progress:  385 on 2677  Progress:  386 on 2677  Progress:  387 on 2677  Progress:  388 on 2677  Progress:  389 on 2677  Progress:  390 on 2677  Progress:  391 on 2677  Progress:  392 on 2677  Progress:  393 on 2677  Progress:  394 on 2677  Progress:  395 on 2677  Progress:  396 on 2677  Progress:  397 on 2677  Progress:  398 on 2677  Progress:  399 on 2677  Progress:  400 on 2677  Progress:  401 on 2677  Progress:  402 on 2677  Progress:  403 on 2677  Progress:  404 on 2677  Progress:  405 on 2677  Progress:  406 on 2677  Progress:  407 on 2677  Progress:  408 on 2677  Progress:  409 on 2677  Progress:  410 on 2677  Progress:  411 on 2677  Progress:  412 on 2677  Progress:  413 on 2677  Progress:  414 on 2677  Progress:  415 on 2677  Progress:  416 on 2677  Progress:  417 on 2677  Progress:  418 on 2677  Progress:  419 on 2677  Progress:  420 on 2677  Progress:  421 on 2677  Progress:  422 on 2677  Progress:  423 on 2677  Progress:  424 on 2677  Progress:  425 on 2677  Progress:  426 on 2677  Progress:  427 on 2677  Progress:  428 on 2677  Progress:  429 on 2677  Progress:  430 on 2677  Progress:  431 on 2677  Progress:  432 on 2677  Progress:  433 on 2677  Progress:  434 on 2677  Progress:  435 on 2677  Progress:  436 on 2677  Progress:  437 on 2677  Progress:  438 on 2677  Progress:  439 on 2677  Progress:  440 on 2677  Progress:  441 on 2677  Progress:  442 on 2677  Progress:  443 on 2677  Progress:  444 on 2677  Progress:  445 on 2677  Progress:  446 on 2677  Progress:  447 on 2677  Progress:  448 on 2677  Progress:  449 on 2677  Progress:  450 on 2677  Progress:  451 on 2677  Progress:  452 on 2677  Progress:  453 on 2677  Progress:  454 on 2677  Progress:  455 on 2677  Progress:  456 on 2677  Progress:  457 on 2677  Progress:  458 on 2677  Progress:  459 on 2677  Progress:  460 on 2677  Progress:  461 on 2677  Progress:  462 on 2677  Progress:  463 on 2677  Progress:  464 on 2677  Progress:  465 on 2677  Progress:  466 on 2677  Progress:  467 on 2677  Progress:  468 on 2677  Progress:  469 on 2677  Progress:  470 on 2677  Progress:  471 on 2677  Progress:  472 on 2677  Progress:  473 on 2677  Progress:  474 on 2677  Progress:  475 on 2677  Progress:  476 on 2677  Progress:  477 on 2677  Progress:  478 on 2677  Progress:  479 on 2677  Progress:  480 on 2677  Progress:  481 on 2677  Progress:  482 on 2677  Progress:  483 on 2677  Progress:  484 on 2677  Progress:  485 on 2677  Progress:  486 on 2677  Progress:  487 on 2677  Progress:  488 on 2677  Progress:  489 on 2677  Progress:  490 on 2677  Progress:  491 on 2677  Progress:  492 on 2677  Progress:  493 on 2677  Progress:  494 on 2677  Progress:  495 on 2677  Progress:  496 on 2677  Progress:  497 on 2677  Progress:  498 on 2677  Progress:  499 on 2677  Progress:  500 on 2677  Progress:  501 on 2677  Progress:  502 on 2677  Progress:  503 on 2677  Progress:  504 on 2677  Progress:  505 on 2677  Progress:  506 on 2677  Progress:  507 on 2677  Progress:  508 on 2677  Progress:  509 on 2677  Progress:  510 on 2677  Progress:  511 on 2677  Progress:  512 on 2677  Progress:  513 on 2677  Progress:  514 on 2677  Progress:  515 on 2677  Progress:  516 on 2677  Progress:  517 on 2677  Progress:  518 on 2677  Progress:  519 on 2677  Progress:  520 on 2677  Progress:  521 on 2677  Progress:  522 on 2677  Progress:  523 on 2677  Progress:  524 on 2677  Progress:  525 on 2677  Progress:  526 on 2677  Progress:  527 on 2677  Progress:  528 on 2677  Progress:  529 on 2677  Progress:  530 on 2677  Progress:  531 on 2677  Progress:  532 on 2677  Progress:  533 on 2677  Progress:  534 on 2677  Progress:  535 on 2677  Progress:  536 on 2677  Progress:  537 on 2677  Progress:  538 on 2677  Progress:  539 on 2677  Progress:  540 on 2677  Progress:  541 on 2677  Progress:  542 on 2677  Progress:  543 on 2677  Progress:  544 on 2677  Progress:  545 on 2677  Progress:  546 on 2677  Progress:  547 on 2677  Progress:  548 on 2677  Progress:  549 on 2677  Progress:  550 on 2677  Progress:  551 on 2677  Progress:  552 on 2677  Progress:  553 on 2677  Progress:  554 on 2677  Progress:  555 on 2677  Progress:  556 on 2677  Progress:  557 on 2677  Progress:  558 on 2677  Progress:  559 on 2677  Progress:  560 on 2677  Progress:  561 on 2677  Progress:  562 on 2677  Progress:  563 on 2677  Progress:  564 on 2677  Progress:  565 on 2677  Progress:  566 on 2677  Progress:  567 on 2677  Progress:  568 on 2677  Progress:  569 on 2677  Progress:  570 on 2677  Progress:  571 on 2677  Progress:  572 on 2677  Progress:  573 on 2677  Progress:  574 on 2677  Progress:  575 on 2677  Progress:  576 on 2677  Progress:  577 on 2677  Progress:  578 on 2677  Progress:  579 on 2677  Progress:  580 on 2677  Progress:  581 on 2677  Progress:  582 on 2677  Progress:  583 on 2677  Progress:  584 on 2677  Progress:  585 on 2677  Progress:  586 on 2677  Progress:  587 on 2677  Progress:  588 on 2677  Progress:  589 on 2677  Progress:  590 on 2677  Progress:  591 on 2677  Progress:  592 on 2677  Progress:  593 on 2677  Progress:  594 on 2677  Progress:  595 on 2677  Progress:  596 on 2677  Progress:  597 on 2677  Progress:  598 on 2677  Progress:  599 on 2677  Progress:  600 on 2677  Progress:  601 on 2677  Progress:  602 on 2677  Progress:  603 on 2677  Progress:  604 on 2677  Progress:  605 on 2677  Progress:  606 on 2677  Progress:  607 on 2677  Progress:  608 on 2677  Progress:  609 on 2677  Progress:  610 on 2677  Progress:  611 on 2677  Progress:  612 on 2677  Progress:  613 on 2677  Progress:  614 on 2677  Progress:  615 on 2677  Progress:  616 on 2677  Progress:  617 on 2677  Progress:  618 on 2677  Progress:  619 on 2677  Progress:  620 on 2677  Progress:  621 on 2677  Progress:  622 on 2677  Progress:  623 on 2677  Progress:  624 on 2677  Progress:  625 on 2677  Progress:  626 on 2677  Progress:  627 on 2677  Progress:  628 on 2677  Progress:  629 on 2677  Progress:  630 on 2677  Progress:  631 on 2677  Progress:  632 on 2677  Progress:  633 on 2677  Progress:  634 on 2677  Progress:  635 on 2677  Progress:  636 on 2677  Progress:  637 on 2677  Progress:  638 on 2677  Progress:  639 on 2677  Progress:  640 on 2677  Progress:  641 on 2677  Progress:  642 on 2677  Progress:  643 on 2677  Progress:  644 on 2677  Progress:  645 on 2677  Progress:  646 on 2677  Progress:  647 on 2677  Progress:  648 on 2677  Progress:  649 on 2677  Progress:  650 on 2677  Progress:  651 on 2677  Progress:  652 on 2677  Progress:  653 on 2677  Progress:  654 on 2677  Progress:  655 on 2677  Progress:  656 on 2677  Progress:  657 on 2677  Progress:  658 on 2677  Progress:  659 on 2677  Progress:  660 on 2677  Progress:  661 on 2677  Progress:  662 on 2677  Progress:  663 on 2677  Progress:  664 on 2677  Progress:  665 on 2677  Progress:  666 on 2677  Progress:  667 on 2677  Progress:  668 on 2677  Progress:  669 on 2677  Progress:  670 on 2677  Progress:  671 on 2677  Progress:  672 on 2677  Progress:  673 on 2677  Progress:  674 on 2677  Progress:  675 on 2677  Progress:  676 on 2677  Progress:  677 on 2677  Progress:  678 on 2677  Progress:  679 on 2677  Progress:  680 on 2677  Progress:  681 on 2677  Progress:  682 on 2677  Progress:  683 on 2677  Progress:  684 on 2677  Progress:  685 on 2677  Progress:  686 on 2677  Progress:  687 on 2677  Progress:  688 on 2677  Progress:  689 on 2677  Progress:  690 on 2677  Progress:  691 on 2677  Progress:  692 on 2677  Progress:  693 on 2677  Progress:  694 on 2677  Progress:  695 on 2677  Progress:  696 on 2677  Progress:  697 on 2677  Progress:  698 on 2677  Progress:  699 on 2677  Progress:  700 on 2677  Progress:  701 on 2677  Progress:  702 on 2677  Progress:  703 on 2677  Progress:  704 on 2677  Progress:  705 on 2677  Progress:  706 on 2677  Progress:  707 on 2677  Progress:  708 on 2677  Progress:  709 on 2677  Progress:  710 on 2677  Progress:  711 on 2677  Progress:  712 on 2677  Progress:  713 on 2677  Progress:  714 on 2677  Progress:  715 on 2677  Progress:  716 on 2677  Progress:  717 on 2677  Progress:  718 on 2677  Progress:  719 on 2677  Progress:  720 on 2677  Progress:  721 on 2677  Progress:  722 on 2677  Progress:  723 on 2677  Progress:  724 on 2677  Progress:  725 on 2677  Progress:  726 on 2677  Progress:  727 on 2677  Progress:  728 on 2677  Progress:  729 on 2677  Progress:  730 on 2677  Progress:  731 on 2677  Progress:  732 on 2677  Progress:  733 on 2677  Progress:  734 on 2677  Progress:  735 on 2677  Progress:  736 on 2677  Progress:  737 on 2677  Progress:  738 on 2677  Progress:  739 on 2677  Progress:  740 on 2677  Progress:  741 on 2677  Progress:  742 on 2677  Progress:  743 on 2677  Progress:  744 on 2677  Progress:  745 on 2677  Progress:  746 on 2677  Progress:  747 on 2677  Progress:  748 on 2677  Progress:  749 on 2677  Progress:  750 on 2677  Progress:  751 on 2677  Progress:  752 on 2677  Progress:  753 on 2677  Progress:  754 on 2677  Progress:  755 on 2677  Progress:  756 on 2677  Progress:  757 on 2677  Progress:  758 on 2677  Progress:  759 on 2677  Progress:  760 on 2677  Progress:  761 on 2677  Progress:  762 on 2677  Progress:  763 on 2677  Progress:  764 on 2677  Progress:  765 on 2677  Progress:  766 on 2677  Progress:  767 on 2677  Progress:  768 on 2677  Progress:  769 on 2677  Progress:  770 on 2677  Progress:  771 on 2677  Progress:  772 on 2677  Progress:  773 on 2677  Progress:  774 on 2677  Progress:  775 on 2677  Progress:  776 on 2677  Progress:  777 on 2677  Progress:  778 on 2677  Progress:  779 on 2677  Progress:  780 on 2677  Progress:  781 on 2677  Progress:  782 on 2677  Progress:  783 on 2677  Progress:  784 on 2677  Progress:  785 on 2677  Progress:  786 on 2677  Progress:  787 on 2677  Progress:  788 on 2677  Progress:  789 on 2677  Progress:  790 on 2677  Progress:  791 on 2677  Progress:  792 on 2677  Progress:  793 on 2677  Progress:  794 on 2677  Progress:  795 on 2677  Progress:  796 on 2677  Progress:  797 on 2677  Progress:  798 on 2677  Progress:  799 on 2677  Progress:  800 on 2677  Progress:  801 on 2677  Progress:  802 on 2677  Progress:  803 on 2677  Progress:  804 on 2677  Progress:  805 on 2677  Progress:  806 on 2677  Progress:  807 on 2677  Progress:  808 on 2677  Progress:  809 on 2677  Progress:  810 on 2677  Progress:  811 on 2677  Progress:  812 on 2677  Progress:  813 on 2677  Progress:  814 on 2677  Progress:  815 on 2677  Progress:  816 on 2677  Progress:  817 on 2677  Progress:  818 on 2677  Progress:  819 on 2677  Progress:  820 on 2677  Progress:  821 on 2677  Progress:  822 on 2677  Progress:  823 on 2677  Progress:  824 on 2677  Progress:  825 on 2677  Progress:  826 on 2677  Progress:  827 on 2677  Progress:  828 on 2677  Progress:  829 on 2677  Progress:  830 on 2677  Progress:  831 on 2677  Progress:  832 on 2677  Progress:  833 on 2677  Progress:  834 on 2677  Progress:  835 on 2677  Progress:  836 on 2677  Progress:  837 on 2677  Progress:  838 on 2677  Progress:  839 on 2677  Progress:  840 on 2677  Progress:  841 on 2677  Progress:  842 on 2677  Progress:  843 on 2677  Progress:  844 on 2677  Progress:  845 on 2677  Progress:  846 on 2677  Progress:  847 on 2677  Progress:  848 on 2677  Progress:  849 on 2677  Progress:  850 on 2677  Progress:  851 on 2677  Progress:  852 on 2677  Progress:  853 on 2677  Progress:  854 on 2677  Progress:  855 on 2677  Progress:  856 on 2677  Progress:  857 on 2677  Progress:  858 on 2677  Progress:  859 on 2677  Progress:  860 on 2677  Progress:  861 on 2677  Progress:  862 on 2677  Progress:  863 on 2677  Progress:  864 on 2677  Progress:  865 on 2677  Progress:  866 on 2677  Progress:  867 on 2677  Progress:  868 on 2677  Progress:  869 on 2677  Progress:  870 on 2677  Progress:  871 on 2677  Progress:  872 on 2677  Progress:  873 on 2677  Progress:  874 on 2677  Progress:  875 on 2677  Progress:  876 on 2677  Progress:  877 on 2677  Progress:  878 on 2677  Progress:  879 on 2677  Progress:  880 on 2677  Progress:  881 on 2677  Progress:  882 on 2677  Progress:  883 on 2677  Progress:  884 on 2677  Progress:  885 on 2677  Progress:  886 on 2677  Progress:  887 on 2677  Progress:  888 on 2677  Progress:  889 on 2677  Progress:  890 on 2677  Progress:  891 on 2677  Progress:  892 on 2677  Progress:  893 on 2677  Progress:  894 on 2677  Progress:  895 on 2677  Progress:  896 on 2677  Progress:  897 on 2677  Progress:  898 on 2677  Progress:  899 on 2677  Progress:  900 on 2677  Progress:  901 on 2677  Progress:  902 on 2677  Progress:  903 on 2677  Progress:  904 on 2677  Progress:  905 on 2677  Progress:  906 on 2677  Progress:  907 on 2677  Progress:  908 on 2677  Progress:  909 on 2677  Progress:  910 on 2677  Progress:  911 on 2677  Progress:  912 on 2677  Progress:  913 on 2677  Progress:  914 on 2677  Progress:  915 on 2677  Progress:  916 on 2677  Progress:  917 on 2677  Progress:  918 on 2677  Progress:  919 on 2677  Progress:  920 on 2677  Progress:  921 on 2677  Progress:  922 on 2677  Progress:  923 on 2677  Progress:  924 on 2677  Progress:  925 on 2677  Progress:  926 on 2677  Progress:  927 on 2677  Progress:  928 on 2677  Progress:  929 on 2677  Progress:  930 on 2677  Progress:  931 on 2677  Progress:  932 on 2677  Progress:  933 on 2677  Progress:  934 on 2677  Progress:  935 on 2677  Progress:  936 on 2677  Progress:  937 on 2677  Progress:  938 on 2677  Progress:  939 on 2677  Progress:  940 on 2677  Progress:  941 on 2677  Progress:  942 on 2677  Progress:  943 on 2677  Progress:  944 on 2677  Progress:  945 on 2677  Progress:  946 on 2677  Progress:  947 on 2677  Progress:  948 on 2677  Progress:  949 on 2677  Progress:  950 on 2677  Progress:  951 on 2677  Progress:  952 on 2677  Progress:  953 on 2677  Progress:  954 on 2677  Progress:  955 on 2677  Progress:  956 on 2677  Progress:  957 on 2677  Progress:  958 on 2677  Progress:  959 on 2677  Progress:  960 on 2677  Progress:  961 on 2677  Progress:  962 on 2677  Progress:  963 on 2677  Progress:  964 on 2677  Progress:  965 on 2677  Progress:  966 on 2677  Progress:  967 on 2677  Progress:  968 on 2677  Progress:  969 on 2677  Progress:  970 on 2677  Progress:  971 on 2677  Progress:  972 on 2677  Progress:  973 on 2677  Progress:  974 on 2677  Progress:  975 on 2677  Progress:  976 on 2677  Progress:  977 on 2677  Progress:  978 on 2677  Progress:  979 on 2677  Progress:  980 on 2677  Progress:  981 on 2677  Progress:  982 on 2677  Progress:  983 on 2677  Progress:  984 on 2677  Progress:  985 on 2677  Progress:  986 on 2677  Progress:  987 on 2677  Progress:  988 on 2677  Progress:  989 on 2677  Progress:  990 on 2677  Progress:  991 on 2677  Progress:  992 on 2677  Progress:  993 on 2677  Progress:  994 on 2677  Progress:  995 on 2677  Progress:  996 on 2677  Progress:  997 on 2677  Progress:  998 on 2677  Progress:  999 on 2677  Progress: 1000 on 2677  Progress: 1001 on 2677  Progress: 1002 on 2677  Progress: 1003 on 2677  Progress: 1004 on 2677  Progress: 1005 on 2677  Progress: 1006 on 2677  Progress: 1007 on 2677  Progress: 1008 on 2677  Progress: 1009 on 2677  Progress: 1010 on 2677  Progress: 1011 on 2677  Progress: 1012 on 2677  Progress: 1013 on 2677  Progress: 1014 on 2677  Progress: 1015 on 2677  Progress: 1016 on 2677  Progress: 1017 on 2677  Progress: 1018 on 2677  Progress: 1019 on 2677  Progress: 1020 on 2677  Progress: 1021 on 2677  Progress: 1022 on 2677  Progress: 1023 on 2677  Progress: 1024 on 2677  Progress: 1025 on 2677  Progress: 1026 on 2677  Progress: 1027 on 2677  Progress: 1028 on 2677  Progress: 1029 on 2677  Progress: 1030 on 2677  Progress: 1031 on 2677  Progress: 1032 on 2677  Progress: 1033 on 2677  Progress: 1034 on 2677  Progress: 1035 on 2677  Progress: 1036 on 2677  Progress: 1037 on 2677  Progress: 1038 on 2677  Progress: 1039 on 2677  Progress: 1040 on 2677  Progress: 1041 on 2677  Progress: 1042 on 2677  Progress: 1043 on 2677  Progress: 1044 on 2677  Progress: 1045 on 2677  Progress: 1046 on 2677  Progress: 1047 on 2677  Progress: 1048 on 2677  Progress: 1049 on 2677  Progress: 1050 on 2677  Progress: 1051 on 2677  Progress: 1052 on 2677  Progress: 1053 on 2677  Progress: 1054 on 2677  Progress: 1055 on 2677  Progress: 1056 on 2677  Progress: 1057 on 2677  Progress: 1058 on 2677  Progress: 1059 on 2677  Progress: 1060 on 2677  Progress: 1061 on 2677  Progress: 1062 on 2677  Progress: 1063 on 2677  Progress: 1064 on 2677  Progress: 1065 on 2677  Progress: 1066 on 2677  Progress: 1067 on 2677  Progress: 1068 on 2677  Progress: 1069 on 2677  Progress: 1070 on 2677  Progress: 1071 on 2677  Progress: 1072 on 2677  Progress: 1073 on 2677  Progress: 1074 on 2677  Progress: 1075 on 2677  Progress: 1076 on 2677  Progress: 1077 on 2677  Progress: 1078 on 2677  Progress: 1079 on 2677  Progress: 1080 on 2677  Progress: 1081 on 2677  Progress: 1082 on 2677  Progress: 1083 on 2677  Progress: 1084 on 2677  Progress: 1085 on 2677  Progress: 1086 on 2677  Progress: 1087 on 2677  Progress: 1088 on 2677  Progress: 1089 on 2677  Progress: 1090 on 2677  Progress: 1091 on 2677  Progress: 1092 on 2677  Progress: 1093 on 2677  Progress: 1094 on 2677  Progress: 1095 on 2677  Progress: 1096 on 2677  Progress: 1097 on 2677  Progress: 1098 on 2677  Progress: 1099 on 2677  Progress: 1100 on 2677  Progress: 1101 on 2677  Progress: 1102 on 2677  Progress: 1103 on 2677  Progress: 1104 on 2677  Progress: 1105 on 2677  Progress: 1106 on 2677  Progress: 1107 on 2677  Progress: 1108 on 2677  Progress: 1109 on 2677  Progress: 1110 on 2677  Progress: 1111 on 2677  Progress: 1112 on 2677  Progress: 1113 on 2677  Progress: 1114 on 2677  Progress: 1115 on 2677  Progress: 1116 on 2677  Progress: 1117 on 2677  Progress: 1118 on 2677  Progress: 1119 on 2677  Progress: 1120 on 2677  Progress: 1121 on 2677  Progress: 1122 on 2677  Progress: 1123 on 2677  Progress: 1124 on 2677  Progress: 1125 on 2677  Progress: 1126 on 2677  Progress: 1127 on 2677  Progress: 1128 on 2677  Progress: 1129 on 2677  Progress: 1130 on 2677  Progress: 1131 on 2677  Progress: 1132 on 2677  Progress: 1133 on 2677  Progress: 1134 on 2677  Progress: 1135 on 2677  Progress: 1136 on 2677  Progress: 1137 on 2677  Progress: 1138 on 2677  Progress: 1139 on 2677  Progress: 1140 on 2677  Progress: 1141 on 2677  Progress: 1142 on 2677  Progress: 1143 on 2677  Progress: 1144 on 2677  Progress: 1145 on 2677  Progress: 1146 on 2677  Progress: 1147 on 2677  Progress: 1148 on 2677  Progress: 1149 on 2677  Progress: 1150 on 2677  Progress: 1151 on 2677  Progress: 1152 on 2677  Progress: 1153 on 2677  Progress: 1154 on 2677  Progress: 1155 on 2677  Progress: 1156 on 2677  Progress: 1157 on 2677  Progress: 1158 on 2677  Progress: 1159 on 2677  Progress: 1160 on 2677  Progress: 1161 on 2677  Progress: 1162 on 2677  Progress: 1163 on 2677  Progress: 1164 on 2677  Progress: 1165 on 2677  Progress: 1166 on 2677  Progress: 1167 on 2677  Progress: 1168 on 2677  Progress: 1169 on 2677  Progress: 1170 on 2677  Progress: 1171 on 2677  Progress: 1172 on 2677  Progress: 1173 on 2677  Progress: 1174 on 2677  Progress: 1175 on 2677  Progress: 1176 on 2677  Progress: 1177 on 2677  Progress: 1178 on 2677  Progress: 1179 on 2677  Progress: 1180 on 2677  Progress: 1181 on 2677  Progress: 1182 on 2677  Progress: 1183 on 2677  Progress: 1184 on 2677  Progress: 1185 on 2677  Progress: 1186 on 2677  Progress: 1187 on 2677  Progress: 1188 on 2677  Progress: 1189 on 2677  Progress: 1190 on 2677  Progress: 1191 on 2677  Progress: 1192 on 2677  Progress: 1193 on 2677  Progress: 1194 on 2677  Progress: 1195 on 2677  Progress: 1196 on 2677  Progress: 1197 on 2677  Progress: 1198 on 2677  Progress: 1199 on 2677  Progress: 1200 on 2677  Progress: 1201 on 2677  Progress: 1202 on 2677  Progress: 1203 on 2677  Progress: 1204 on 2677  Progress: 1205 on 2677  Progress: 1206 on 2677  Progress: 1207 on 2677  Progress: 1208 on 2677  Progress: 1209 on 2677  Progress: 1210 on 2677  Progress: 1211 on 2677  Progress: 1212 on 2677  Progress: 1213 on 2677  Progress: 1214 on 2677  Progress: 1215 on 2677  Progress: 1216 on 2677  Progress: 1217 on 2677  Progress: 1218 on 2677  Progress: 1219 on 2677  Progress: 1220 on 2677  Progress: 1221 on 2677  Progress: 1222 on 2677  Progress: 1223 on 2677  Progress: 1224 on 2677  Progress: 1225 on 2677  Progress: 1226 on 2677  Progress: 1227 on 2677  Progress: 1228 on 2677  Progress: 1229 on 2677  Progress: 1230 on 2677  Progress: 1231 on 2677  Progress: 1232 on 2677  Progress: 1233 on 2677  Progress: 1234 on 2677  Progress: 1235 on 2677  Progress: 1236 on 2677  Progress: 1237 on 2677  Progress: 1238 on 2677  Progress: 1239 on 2677  Progress: 1240 on 2677  Progress: 1241 on 2677  Progress: 1242 on 2677  Progress: 1243 on 2677  Progress: 1244 on 2677  Progress: 1245 on 2677  Progress: 1246 on 2677  Progress: 1247 on 2677  Progress: 1248 on 2677  Progress: 1249 on 2677  Progress: 1250 on 2677  Progress: 1251 on 2677  Progress: 1252 on 2677  Progress: 1253 on 2677  Progress: 1254 on 2677  Progress: 1255 on 2677  Progress: 1256 on 2677  Progress: 1257 on 2677  Progress: 1258 on 2677  Progress: 1259 on 2677  Progress: 1260 on 2677  Progress: 1261 on 2677  Progress: 1262 on 2677  Progress: 1263 on 2677  Progress: 1264 on 2677  Progress: 1265 on 2677  Progress: 1266 on 2677  Progress: 1267 on 2677  Progress: 1268 on 2677  Progress: 1269 on 2677  Progress: 1270 on 2677  Progress: 1271 on 2677  Progress: 1272 on 2677  Progress: 1273 on 2677  Progress: 1274 on 2677  Progress: 1275 on 2677  Progress: 1276 on 2677  Progress: 1277 on 2677  Progress: 1278 on 2677  Progress: 1279 on 2677  Progress: 1280 on 2677  Progress: 1281 on 2677  Progress: 1282 on 2677  Progress: 1283 on 2677  Progress: 1284 on 2677  Progress: 1285 on 2677  Progress: 1286 on 2677  Progress: 1287 on 2677  Progress: 1288 on 2677  Progress: 1289 on 2677  Progress: 1290 on 2677  Progress: 1291 on 2677  Progress: 1292 on 2677  Progress: 1293 on 2677  Progress: 1294 on 2677  Progress: 1295 on 2677  Progress: 1296 on 2677  Progress: 1297 on 2677  Progress: 1298 on 2677  Progress: 1299 on 2677  Progress: 1300 on 2677  Progress: 1301 on 2677  Progress: 1302 on 2677  Progress: 1303 on 2677  Progress: 1304 on 2677  Progress: 1305 on 2677  Progress: 1306 on 2677  Progress: 1307 on 2677  Progress: 1308 on 2677  Progress: 1309 on 2677  Progress: 1310 on 2677  Progress: 1311 on 2677  Progress: 1312 on 2677  Progress: 1313 on 2677  Progress: 1314 on 2677  Progress: 1315 on 2677  Progress: 1316 on 2677  Progress: 1317 on 2677  Progress: 1318 on 2677  Progress: 1319 on 2677  Progress: 1320 on 2677  Progress: 1321 on 2677  Progress: 1322 on 2677  Progress: 1323 on 2677  Progress: 1324 on 2677  Progress: 1325 on 2677  Progress: 1326 on 2677  Progress: 1327 on 2677  Progress: 1328 on 2677  Progress: 1329 on 2677  Progress: 1330 on 2677  Progress: 1331 on 2677  Progress: 1332 on 2677  Progress: 1333 on 2677  Progress: 1334 on 2677  Progress: 1335 on 2677  Progress: 1336 on 2677  Progress: 1337 on 2677  Progress: 1338 on 2677  Progress: 1339 on 2677  Progress: 1340 on 2677  Progress: 1341 on 2677  Progress: 1342 on 2677  Progress: 1343 on 2677  Progress: 1344 on 2677  Progress: 1345 on 2677  Progress: 1346 on 2677  Progress: 1347 on 2677  Progress: 1348 on 2677  Progress: 1349 on 2677  Progress: 1350 on 2677  Progress: 1351 on 2677  Progress: 1352 on 2677  Progress: 1353 on 2677  Progress: 1354 on 2677  Progress: 1355 on 2677  Progress: 1356 on 2677  Progress: 1357 on 2677  Progress: 1358 on 2677  Progress: 1359 on 2677  Progress: 1360 on 2677  Progress: 1361 on 2677  Progress: 1362 on 2677  Progress: 1363 on 2677  Progress: 1364 on 2677  Progress: 1365 on 2677  Progress: 1366 on 2677  Progress: 1367 on 2677  Progress: 1368 on 2677  Progress: 1369 on 2677  Progress: 1370 on 2677  Progress: 1371 on 2677  Progress: 1372 on 2677  Progress: 1373 on 2677  Progress: 1374 on 2677  Progress: 1375 on 2677  Progress: 1376 on 2677  Progress: 1377 on 2677  Progress: 1378 on 2677  Progress: 1379 on 2677  Progress: 1380 on 2677  Progress: 1381 on 2677  Progress: 1382 on 2677  Progress: 1383 on 2677  Progress: 1384 on 2677  Progress: 1385 on 2677  Progress: 1386 on 2677  Progress: 1387 on 2677  Progress: 1388 on 2677  Progress: 1389 on 2677  Progress: 1390 on 2677  Progress: 1391 on 2677  Progress: 1392 on 2677  Progress: 1393 on 2677  Progress: 1394 on 2677  Progress: 1395 on 2677  Progress: 1396 on 2677  Progress: 1397 on 2677  Progress: 1398 on 2677  Progress: 1399 on 2677  Progress: 1400 on 2677  Progress: 1401 on 2677  Progress: 1402 on 2677  Progress: 1403 on 2677  Progress: 1404 on 2677  Progress: 1405 on 2677  Progress: 1406 on 2677  Progress: 1407 on 2677  Progress: 1408 on 2677  Progress: 1409 on 2677  Progress: 1410 on 2677  Progress: 1411 on 2677  Progress: 1412 on 2677  Progress: 1413 on 2677  Progress: 1414 on 2677  Progress: 1415 on 2677  Progress: 1416 on 2677  Progress: 1417 on 2677  Progress: 1418 on 2677  Progress: 1419 on 2677  Progress: 1420 on 2677  Progress: 1421 on 2677  Progress: 1422 on 2677  Progress: 1423 on 2677  Progress: 1424 on 2677  Progress: 1425 on 2677  Progress: 1426 on 2677  Progress: 1427 on 2677  Progress: 1428 on 2677  Progress: 1429 on 2677  Progress: 1430 on 2677  Progress: 1431 on 2677  Progress: 1432 on 2677  Progress: 1433 on 2677  Progress: 1434 on 2677  Progress: 1435 on 2677  Progress: 1436 on 2677  Progress: 1437 on 2677  Progress: 1438 on 2677  Progress: 1439 on 2677  Progress: 1440 on 2677  Progress: 1441 on 2677  Progress: 1442 on 2677  Progress: 1443 on 2677  Progress: 1444 on 2677  Progress: 1445 on 2677  Progress: 1446 on 2677  Progress: 1447 on 2677  Progress: 1448 on 2677  Progress: 1449 on 2677  Progress: 1450 on 2677  Progress: 1451 on 2677  Progress: 1452 on 2677  Progress: 1453 on 2677  Progress: 1454 on 2677  Progress: 1455 on 2677  Progress: 1456 on 2677  Progress: 1457 on 2677  Progress: 1458 on 2677  Progress: 1459 on 2677  Progress: 1460 on 2677  Progress: 1461 on 2677  Progress: 1462 on 2677  Progress: 1463 on 2677  Progress: 1464 on 2677  Progress: 1465 on 2677  Progress: 1466 on 2677  Progress: 1467 on 2677  Progress: 1468 on 2677  Progress: 1469 on 2677  Progress: 1470 on 2677  Progress: 1471 on 2677  Progress: 1472 on 2677  Progress: 1473 on 2677  Progress: 1474 on 2677  Progress: 1475 on 2677  Progress: 1476 on 2677  Progress: 1477 on 2677  Progress: 1478 on 2677  Progress: 1479 on 2677  Progress: 1480 on 2677  Progress: 1481 on 2677  Progress: 1482 on 2677  Progress: 1483 on 2677  Progress: 1484 on 2677  Progress: 1485 on 2677  Progress: 1486 on 2677  Progress: 1487 on 2677  Progress: 1488 on 2677  Progress: 1489 on 2677  Progress: 1490 on 2677  Progress: 1491 on 2677  Progress: 1492 on 2677  Progress: 1493 on 2677  Progress: 1494 on 2677  Progress: 1495 on 2677  Progress: 1496 on 2677  Progress: 1497 on 2677  Progress: 1498 on 2677  Progress: 1499 on 2677  Progress: 1500 on 2677  Progress: 1501 on 2677  Progress: 1502 on 2677  Progress: 1503 on 2677  Progress: 1504 on 2677  Progress: 1505 on 2677  Progress: 1506 on 2677  Progress: 1507 on 2677  Progress: 1508 on 2677  Progress: 1509 on 2677  Progress: 1510 on 2677  Progress: 1511 on 2677  Progress: 1512 on 2677  Progress: 1513 on 2677  Progress: 1514 on 2677  Progress: 1515 on 2677  Progress: 1516 on 2677  Progress: 1517 on 2677  Progress: 1518 on 2677  Progress: 1519 on 2677  Progress: 1520 on 2677  Progress: 1521 on 2677  Progress: 1522 on 2677  Progress: 1523 on 2677  Progress: 1524 on 2677  Progress: 1525 on 2677  Progress: 1526 on 2677  Progress: 1527 on 2677  Progress: 1528 on 2677  Progress: 1529 on 2677  Progress: 1530 on 2677  Progress: 1531 on 2677  Progress: 1532 on 2677  Progress: 1533 on 2677  Progress: 1534 on 2677  Progress: 1535 on 2677  Progress: 1536 on 2677  Progress: 1537 on 2677  Progress: 1538 on 2677  Progress: 1539 on 2677  Progress: 1540 on 2677  Progress: 1541 on 2677  Progress: 1542 on 2677  Progress: 1543 on 2677  Progress: 1544 on 2677  Progress: 1545 on 2677  Progress: 1546 on 2677  Progress: 1547 on 2677  Progress: 1548 on 2677  Progress: 1549 on 2677  Progress: 1550 on 2677  Progress: 1551 on 2677  Progress: 1552 on 2677  Progress: 1553 on 2677  Progress: 1554 on 2677  Progress: 1555 on 2677  Progress: 1556 on 2677  Progress: 1557 on 2677  Progress: 1558 on 2677  Progress: 1559 on 2677  Progress: 1560 on 2677  Progress: 1561 on 2677  Progress: 1562 on 2677  Progress: 1563 on 2677  Progress: 1564 on 2677  Progress: 1565 on 2677  Progress: 1566 on 2677  Progress: 1567 on 2677  Progress: 1568 on 2677  Progress: 1569 on 2677  Progress: 1570 on 2677  Progress: 1571 on 2677  Progress: 1572 on 2677  Progress: 1573 on 2677  Progress: 1574 on 2677  Progress: 1575 on 2677  Progress: 1576 on 2677  Progress: 1577 on 2677  Progress: 1578 on 2677  Progress: 1579 on 2677  Progress: 1580 on 2677  Progress: 1581 on 2677  Progress: 1582 on 2677  Progress: 1583 on 2677  Progress: 1584 on 2677  Progress: 1585 on 2677  Progress: 1586 on 2677  Progress: 1587 on 2677  Progress: 1588 on 2677  Progress: 1589 on 2677  Progress: 1590 on 2677  Progress: 1591 on 2677  Progress: 1592 on 2677  Progress: 1593 on 2677  Progress: 1594 on 2677  Progress: 1595 on 2677  Progress: 1596 on 2677  Progress: 1597 on 2677  Progress: 1598 on 2677  Progress: 1599 on 2677  Progress: 1600 on 2677  Progress: 1601 on 2677  Progress: 1602 on 2677  Progress: 1603 on 2677  Progress: 1604 on 2677  Progress: 1605 on 2677  Progress: 1606 on 2677  Progress: 1607 on 2677  Progress: 1608 on 2677  Progress: 1609 on 2677  Progress: 1610 on 2677  Progress: 1611 on 2677  Progress: 1612 on 2677  Progress: 1613 on 2677  Progress: 1614 on 2677  Progress: 1615 on 2677  Progress: 1616 on 2677  Progress: 1617 on 2677  Progress: 1618 on 2677  Progress: 1619 on 2677  Progress: 1620 on 2677  Progress: 1621 on 2677  Progress: 1622 on 2677  Progress: 1623 on 2677  Progress: 1624 on 2677  Progress: 1625 on 2677  Progress: 1626 on 2677  Progress: 1627 on 2677  Progress: 1628 on 2677  Progress: 1629 on 2677  Progress: 1630 on 2677  Progress: 1631 on 2677  Progress: 1632 on 2677  Progress: 1633 on 2677  Progress: 1634 on 2677  Progress: 1635 on 2677  Progress: 1636 on 2677  Progress: 1637 on 2677  Progress: 1638 on 2677  Progress: 1639 on 2677  Progress: 1640 on 2677  Progress: 1641 on 2677  Progress: 1642 on 2677  Progress: 1643 on 2677  Progress: 1644 on 2677  Progress: 1645 on 2677  Progress: 1646 on 2677  Progress: 1647 on 2677  Progress: 1648 on 2677  Progress: 1649 on 2677  Progress: 1650 on 2677  Progress: 1651 on 2677  Progress: 1652 on 2677  Progress: 1653 on 2677  Progress: 1654 on 2677  Progress: 1655 on 2677  Progress: 1656 on 2677  Progress: 1657 on 2677  Progress: 1658 on 2677  Progress: 1659 on 2677  Progress: 1660 on 2677  Progress: 1661 on 2677  Progress: 1662 on 2677  Progress: 1663 on 2677  Progress: 1664 on 2677  Progress: 1665 on 2677  Progress: 1666 on 2677  Progress: 1667 on 2677  Progress: 1668 on 2677  Progress: 1669 on 2677  Progress: 1670 on 2677  Progress: 1671 on 2677  Progress: 1672 on 2677  Progress: 1673 on 2677  Progress: 1674 on 2677  Progress: 1675 on 2677  Progress: 1676 on 2677  Progress: 1677 on 2677  Progress: 1678 on 2677  Progress: 1679 on 2677  Progress: 1680 on 2677  Progress: 1681 on 2677  Progress: 1682 on 2677  Progress: 1683 on 2677  Progress: 1684 on 2677  Progress: 1685 on 2677  Progress: 1686 on 2677  Progress: 1687 on 2677  Progress: 1688 on 2677  Progress: 1689 on 2677  Progress: 1690 on 2677  Progress: 1691 on 2677  Progress: 1692 on 2677  Progress: 1693 on 2677  Progress: 1694 on 2677  Progress: 1695 on 2677  Progress: 1696 on 2677  Progress: 1697 on 2677  Progress: 1698 on 2677  Progress: 1699 on 2677  Progress: 1700 on 2677  Progress: 1701 on 2677  Progress: 1702 on 2677  Progress: 1703 on 2677  Progress: 1704 on 2677  Progress: 1705 on 2677  Progress: 1706 on 2677  Progress: 1707 on 2677  Progress: 1708 on 2677  Progress: 1709 on 2677  Progress: 1710 on 2677  Progress: 1711 on 2677  Progress: 1712 on 2677  Progress: 1713 on 2677  Progress: 1714 on 2677  Progress: 1715 on 2677  Progress: 1716 on 2677  Progress: 1717 on 2677  Progress: 1718 on 2677  Progress: 1719 on 2677  Progress: 1720 on 2677  Progress: 1721 on 2677  Progress: 1722 on 2677  Progress: 1723 on 2677  Progress: 1724 on 2677  Progress: 1725 on 2677  Progress: 1726 on 2677  Progress: 1727 on 2677  Progress: 1728 on 2677  Progress: 1729 on 2677  Progress: 1730 on 2677  Progress: 1731 on 2677  Progress: 1732 on 2677  Progress: 1733 on 2677  Progress: 1734 on 2677  Progress: 1735 on 2677  Progress: 1736 on 2677  Progress: 1737 on 2677  Progress: 1738 on 2677  Progress: 1739 on 2677  Progress: 1740 on 2677  Progress: 1741 on 2677  Progress: 1742 on 2677  Progress: 1743 on 2677  Progress: 1744 on 2677  Progress: 1745 on 2677  Progress: 1746 on 2677  Progress: 1747 on 2677  Progress: 1748 on 2677  Progress: 1749 on 2677  Progress: 1750 on 2677  Progress: 1751 on 2677  Progress: 1752 on 2677  Progress: 1753 on 2677  Progress: 1754 on 2677  Progress: 1755 on 2677  Progress: 1756 on 2677  Progress: 1757 on 2677  Progress: 1758 on 2677  Progress: 1759 on 2677  Progress: 1760 on 2677  Progress: 1761 on 2677  Progress: 1762 on 2677  Progress: 1763 on 2677  Progress: 1764 on 2677  Progress: 1765 on 2677  Progress: 1766 on 2677  Progress: 1767 on 2677  Progress: 1768 on 2677  Progress: 1769 on 2677  Progress: 1770 on 2677  Progress: 1771 on 2677  Progress: 1772 on 2677  Progress: 1773 on 2677  Progress: 1774 on 2677  Progress: 1775 on 2677  Progress: 1776 on 2677  Progress: 1777 on 2677  Progress: 1778 on 2677  Progress: 1779 on 2677  Progress: 1780 on 2677  Progress: 1781 on 2677  Progress: 1782 on 2677  Progress: 1783 on 2677  Progress: 1784 on 2677  Progress: 1785 on 2677  Progress: 1786 on 2677  Progress: 1787 on 2677  Progress: 1788 on 2677  Progress: 1789 on 2677  Progress: 1790 on 2677  Progress: 1791 on 2677  Progress: 1792 on 2677  Progress: 1793 on 2677  Progress: 1794 on 2677  Progress: 1795 on 2677  Progress: 1796 on 2677  Progress: 1797 on 2677  Progress: 1798 on 2677  Progress: 1799 on 2677  Progress: 1800 on 2677  Progress: 1801 on 2677  Progress: 1802 on 2677  Progress: 1803 on 2677  Progress: 1804 on 2677  Progress: 1805 on 2677  Progress: 1806 on 2677  Progress: 1807 on 2677  Progress: 1808 on 2677  Progress: 1809 on 2677  Progress: 1810 on 2677  Progress: 1811 on 2677  Progress: 1812 on 2677  Progress: 1813 on 2677  Progress: 1814 on 2677  Progress: 1815 on 2677  Progress: 1816 on 2677  Progress: 1817 on 2677  Progress: 1818 on 2677  Progress: 1819 on 2677  Progress: 1820 on 2677  Progress: 1821 on 2677  Progress: 1822 on 2677  Progress: 1823 on 2677  Progress: 1824 on 2677  Progress: 1825 on 2677  Progress: 1826 on 2677  Progress: 1827 on 2677  Progress: 1828 on 2677  Progress: 1829 on 2677  Progress: 1830 on 2677  Progress: 1831 on 2677  Progress: 1832 on 2677  Progress: 1833 on 2677  Progress: 1834 on 2677  Progress: 1835 on 2677  Progress: 1836 on 2677  Progress: 1837 on 2677  Progress: 1838 on 2677  Progress: 1839 on 2677  Progress: 1840 on 2677  Progress: 1841 on 2677  Progress: 1842 on 2677  Progress: 1843 on 2677  Progress: 1844 on 2677  Progress: 1845 on 2677  Progress: 1846 on 2677  Progress: 1847 on 2677  Progress: 1848 on 2677  Progress: 1849 on 2677  Progress: 1850 on 2677  Progress: 1851 on 2677  Progress: 1852 on 2677  Progress: 1853 on 2677  Progress: 1854 on 2677  Progress: 1855 on 2677  Progress: 1856 on 2677  Progress: 1857 on 2677  Progress: 1858 on 2677  Progress: 1859 on 2677  Progress: 1860 on 2677  Progress: 1861 on 2677  Progress: 1862 on 2677  Progress: 1863 on 2677  Progress: 1864 on 2677  Progress: 1865 on 2677  Progress: 1866 on 2677  Progress: 1867 on 2677  Progress: 1868 on 2677  Progress: 1869 on 2677  Progress: 1870 on 2677  Progress: 1871 on 2677  Progress: 1872 on 2677  Progress: 1873 on 2677  Progress: 1874 on 2677  Progress: 1875 on 2677  Progress: 1876 on 2677  Progress: 1877 on 2677  Progress: 1878 on 2677  Progress: 1879 on 2677  Progress: 1880 on 2677  Progress: 1881 on 2677  Progress: 1882 on 2677  Progress: 1883 on 2677  Progress: 1884 on 2677  Progress: 1885 on 2677  Progress: 1886 on 2677  Progress: 1887 on 2677  Progress: 1888 on 2677  Progress: 1889 on 2677  Progress: 1890 on 2677  Progress: 1891 on 2677  Progress: 1892 on 2677  Progress: 1893 on 2677  Progress: 1894 on 2677  Progress: 1895 on 2677  Progress: 1896 on 2677  Progress: 1897 on 2677  Progress: 1898 on 2677  Progress: 1899 on 2677  Progress: 1900 on 2677  Progress: 1901 on 2677  Progress: 1902 on 2677  Progress: 1903 on 2677  Progress: 1904 on 2677  Progress: 1905 on 2677  Progress: 1906 on 2677  Progress: 1907 on 2677  Progress: 1908 on 2677  Progress: 1909 on 2677  Progress: 1910 on 2677  Progress: 1911 on 2677  Progress: 1912 on 2677  Progress: 1913 on 2677  Progress: 1914 on 2677  Progress: 1915 on 2677  Progress: 1916 on 2677  Progress: 1917 on 2677  Progress: 1918 on 2677  Progress: 1919 on 2677  Progress: 1920 on 2677  Progress: 1921 on 2677  Progress: 1922 on 2677  Progress: 1923 on 2677  Progress: 1924 on 2677  Progress: 1925 on 2677  Progress: 1926 on 2677  Progress: 1927 on 2677  Progress: 1928 on 2677  Progress: 1929 on 2677  Progress: 1930 on 2677  Progress: 1931 on 2677  Progress: 1932 on 2677  Progress: 1933 on 2677  Progress: 1934 on 2677  Progress: 1935 on 2677  Progress: 1936 on 2677  Progress: 1937 on 2677  Progress: 1938 on 2677  Progress: 1939 on 2677  Progress: 1940 on 2677  Progress: 1941 on 2677  Progress: 1942 on 2677  Progress: 1943 on 2677  Progress: 1944 on 2677  Progress: 1945 on 2677  Progress: 1946 on 2677  Progress: 1947 on 2677  Progress: 1948 on 2677  Progress: 1949 on 2677  Progress: 1950 on 2677  Progress: 1951 on 2677  Progress: 1952 on 2677  Progress: 1953 on 2677  Progress: 1954 on 2677  Progress: 1955 on 2677  Progress: 1956 on 2677  Progress: 1957 on 2677  Progress: 1958 on 2677  Progress: 1959 on 2677  Progress: 1960 on 2677  Progress: 1961 on 2677  Progress: 1962 on 2677  Progress: 1963 on 2677  Progress: 1964 on 2677  Progress: 1965 on 2677  Progress: 1966 on 2677  Progress: 1967 on 2677  Progress: 1968 on 2677  Progress: 1969 on 2677  Progress: 1970 on 2677  Progress: 1971 on 2677  Progress: 1972 on 2677  Progress: 1973 on 2677  Progress: 1974 on 2677  Progress: 1975 on 2677  Progress: 1976 on 2677  Progress: 1977 on 2677  Progress: 1978 on 2677  Progress: 1979 on 2677  Progress: 1980 on 2677  Progress: 1981 on 2677  Progress: 1982 on 2677  Progress: 1983 on 2677  Progress: 1984 on 2677  Progress: 1985 on 2677  Progress: 1986 on 2677  Progress: 1987 on 2677  Progress: 1988 on 2677  Progress: 1989 on 2677  Progress: 1990 on 2677  Progress: 1991 on 2677  Progress: 1992 on 2677  Progress: 1993 on 2677  Progress: 1994 on 2677  Progress: 1995 on 2677  Progress: 1996 on 2677  Progress: 1997 on 2677  Progress: 1998 on 2677  Progress: 1999 on 2677  Progress: 2000 on 2677  Progress: 2001 on 2677  Progress: 2002 on 2677  Progress: 2003 on 2677  Progress: 2004 on 2677  Progress: 2005 on 2677  Progress: 2006 on 2677  Progress: 2007 on 2677  Progress: 2008 on 2677  Progress: 2009 on 2677  Progress: 2010 on 2677  Progress: 2011 on 2677  Progress: 2012 on 2677  Progress: 2013 on 2677  Progress: 2014 on 2677  Progress: 2015 on 2677  Progress: 2016 on 2677  Progress: 2017 on 2677  Progress: 2018 on 2677  Progress: 2019 on 2677  Progress: 2020 on 2677  Progress: 2021 on 2677  Progress: 2022 on 2677  Progress: 2023 on 2677  Progress: 2024 on 2677  Progress: 2025 on 2677  Progress: 2026 on 2677  Progress: 2027 on 2677  Progress: 2028 on 2677  Progress: 2029 on 2677  Progress: 2030 on 2677  Progress: 2031 on 2677  Progress: 2032 on 2677  Progress: 2033 on 2677  Progress: 2034 on 2677  Progress: 2035 on 2677  Progress: 2036 on 2677  Progress: 2037 on 2677  Progress: 2038 on 2677  Progress: 2039 on 2677  Progress: 2040 on 2677  Progress: 2041 on 2677  Progress: 2042 on 2677  Progress: 2043 on 2677  Progress: 2044 on 2677  Progress: 2045 on 2677  Progress: 2046 on 2677  Progress: 2047 on 2677  Progress: 2048 on 2677  Progress: 2049 on 2677  Progress: 2050 on 2677  Progress: 2051 on 2677  Progress: 2052 on 2677  Progress: 2053 on 2677  Progress: 2054 on 2677  Progress: 2055 on 2677  Progress: 2056 on 2677  Progress: 2057 on 2677  Progress: 2058 on 2677  Progress: 2059 on 2677  Progress: 2060 on 2677  Progress: 2061 on 2677  Progress: 2062 on 2677  Progress: 2063 on 2677  Progress: 2064 on 2677  Progress: 2065 on 2677  Progress: 2066 on 2677  Progress: 2067 on 2677  Progress: 2068 on 2677  Progress: 2069 on 2677  Progress: 2070 on 2677  Progress: 2071 on 2677  Progress: 2072 on 2677  Progress: 2073 on 2677  Progress: 2074 on 2677  Progress: 2075 on 2677  Progress: 2076 on 2677  Progress: 2077 on 2677  Progress: 2078 on 2677  Progress: 2079 on 2677  Progress: 2080 on 2677  Progress: 2081 on 2677  Progress: 2082 on 2677  Progress: 2083 on 2677  Progress: 2084 on 2677  Progress: 2085 on 2677  Progress: 2086 on 2677  Progress: 2087 on 2677  Progress: 2088 on 2677  Progress: 2089 on 2677  Progress: 2090 on 2677  Progress: 2091 on 2677  Progress: 2092 on 2677  Progress: 2093 on 2677  Progress: 2094 on 2677  Progress: 2095 on 2677  Progress: 2096 on 2677  Progress: 2097 on 2677  Progress: 2098 on 2677  Progress: 2099 on 2677  Progress: 2100 on 2677  Progress: 2101 on 2677  Progress: 2102 on 2677  Progress: 2103 on 2677  Progress: 2104 on 2677  Progress: 2105 on 2677  Progress: 2106 on 2677  Progress: 2107 on 2677  Progress: 2108 on 2677  Progress: 2109 on 2677  Progress: 2110 on 2677  Progress: 2111 on 2677  Progress: 2112 on 2677  Progress: 2113 on 2677  Progress: 2114 on 2677  Progress: 2115 on 2677  Progress: 2116 on 2677  Progress: 2117 on 2677  Progress: 2118 on 2677  Progress: 2119 on 2677  Progress: 2120 on 2677  Progress: 2121 on 2677  Progress: 2122 on 2677  Progress: 2123 on 2677  Progress: 2124 on 2677  Progress: 2125 on 2677  Progress: 2126 on 2677  Progress: 2127 on 2677  Progress: 2128 on 2677  Progress: 2129 on 2677  Progress: 2130 on 2677  Progress: 2131 on 2677  Progress: 2132 on 2677  Progress: 2133 on 2677  Progress: 2134 on 2677  Progress: 2135 on 2677  Progress: 2136 on 2677  Progress: 2137 on 2677  Progress: 2138 on 2677  Progress: 2139 on 2677  Progress: 2140 on 2677  Progress: 2141 on 2677  Progress: 2142 on 2677  Progress: 2143 on 2677  Progress: 2144 on 2677  Progress: 2145 on 2677  Progress: 2146 on 2677  Progress: 2147 on 2677  Progress: 2148 on 2677  Progress: 2149 on 2677  Progress: 2150 on 2677  Progress: 2151 on 2677  Progress: 2152 on 2677  Progress: 2153 on 2677  Progress: 2154 on 2677  Progress: 2155 on 2677  Progress: 2156 on 2677  Progress: 2157 on 2677  Progress: 2158 on 2677  Progress: 2159 on 2677  Progress: 2160 on 2677  Progress: 2161 on 2677  Progress: 2162 on 2677  Progress: 2163 on 2677  Progress: 2164 on 2677  Progress: 2165 on 2677  Progress: 2166 on 2677  Progress: 2167 on 2677  Progress: 2168 on 2677  Progress: 2169 on 2677  Progress: 2170 on 2677  Progress: 2171 on 2677  Progress: 2172 on 2677  Progress: 2173 on 2677  Progress: 2174 on 2677  Progress: 2175 on 2677  Progress: 2176 on 2677  Progress: 2177 on 2677  Progress: 2178 on 2677  Progress: 2179 on 2677  Progress: 2180 on 2677  Progress: 2181 on 2677  Progress: 2182 on 2677  Progress: 2183 on 2677  Progress: 2184 on 2677  Progress: 2185 on 2677  Progress: 2186 on 2677  Progress: 2187 on 2677  Progress: 2188 on 2677  Progress: 2189 on 2677  Progress: 2190 on 2677  Progress: 2191 on 2677  Progress: 2192 on 2677  Progress: 2193 on 2677  Progress: 2194 on 2677  Progress: 2195 on 2677  Progress: 2196 on 2677  Progress: 2197 on 2677  Progress: 2198 on 2677  Progress: 2199 on 2677  Progress: 2200 on 2677  Progress: 2201 on 2677  Progress: 2202 on 2677  Progress: 2203 on 2677  Progress: 2204 on 2677  Progress: 2205 on 2677  Progress: 2206 on 2677  Progress: 2207 on 2677  Progress: 2208 on 2677  Progress: 2209 on 2677  Progress: 2210 on 2677  Progress: 2211 on 2677  Progress: 2212 on 2677  Progress: 2213 on 2677  Progress: 2214 on 2677  Progress: 2215 on 2677  Progress: 2216 on 2677  Progress: 2217 on 2677  Progress: 2218 on 2677  Progress: 2219 on 2677  Progress: 2220 on 2677  Progress: 2221 on 2677  Progress: 2222 on 2677  Progress: 2223 on 2677  Progress: 2224 on 2677  Progress: 2225 on 2677  Progress: 2226 on 2677  Progress: 2227 on 2677  Progress: 2228 on 2677  Progress: 2229 on 2677  Progress: 2230 on 2677  Progress: 2231 on 2677  Progress: 2232 on 2677  Progress: 2233 on 2677  Progress: 2234 on 2677  Progress: 2235 on 2677  Progress: 2236 on 2677  Progress: 2237 on 2677  Progress: 2238 on 2677  Progress: 2239 on 2677  Progress: 2240 on 2677  Progress: 2241 on 2677  Progress: 2242 on 2677  Progress: 2243 on 2677  Progress: 2244 on 2677  Progress: 2245 on 2677  Progress: 2246 on 2677  Progress: 2247 on 2677  Progress: 2248 on 2677  Progress: 2249 on 2677  Progress: 2250 on 2677  Progress: 2251 on 2677  Progress: 2252 on 2677  Progress: 2253 on 2677  Progress: 2254 on 2677  Progress: 2255 on 2677  Progress: 2256 on 2677  Progress: 2257 on 2677  Progress: 2258 on 2677  Progress: 2259 on 2677  Progress: 2260 on 2677  Progress: 2261 on 2677  Progress: 2262 on 2677  Progress: 2263 on 2677  Progress: 2264 on 2677  Progress: 2265 on 2677  Progress: 2266 on 2677  Progress: 2267 on 2677  Progress: 2268 on 2677  Progress: 2269 on 2677  Progress: 2270 on 2677  Progress: 2271 on 2677  Progress: 2272 on 2677  Progress: 2273 on 2677  Progress: 2274 on 2677  Progress: 2275 on 2677  Progress: 2276 on 2677  Progress: 2277 on 2677  Progress: 2278 on 2677  Progress: 2279 on 2677  Progress: 2280 on 2677  Progress: 2281 on 2677  Progress: 2282 on 2677  Progress: 2283 on 2677  Progress: 2284 on 2677  Progress: 2285 on 2677  Progress: 2286 on 2677  Progress: 2287 on 2677  Progress: 2288 on 2677  Progress: 2289 on 2677  Progress: 2290 on 2677  Progress: 2291 on 2677  Progress: 2292 on 2677  Progress: 2293 on 2677  Progress: 2294 on 2677  Progress: 2295 on 2677  Progress: 2296 on 2677  Progress: 2297 on 2677  Progress: 2298 on 2677  Progress: 2299 on 2677  Progress: 2300 on 2677  Progress: 2301 on 2677  Progress: 2302 on 2677  Progress: 2303 on 2677  Progress: 2304 on 2677  Progress: 2305 on 2677  Progress: 2306 on 2677  Progress: 2307 on 2677  Progress: 2308 on 2677  Progress: 2309 on 2677  Progress: 2310 on 2677  Progress: 2311 on 2677  Progress: 2312 on 2677  Progress: 2313 on 2677  Progress: 2314 on 2677  Progress: 2315 on 2677  Progress: 2316 on 2677  Progress: 2317 on 2677  Progress: 2318 on 2677  Progress: 2319 on 2677  Progress: 2320 on 2677  Progress: 2321 on 2677  Progress: 2322 on 2677  Progress: 2323 on 2677  Progress: 2324 on 2677  Progress: 2325 on 2677  Progress: 2326 on 2677  Progress: 2327 on 2677  Progress: 2328 on 2677  Progress: 2329 on 2677  Progress: 2330 on 2677  Progress: 2331 on 2677  Progress: 2332 on 2677  Progress: 2333 on 2677  Progress: 2334 on 2677  Progress: 2335 on 2677  Progress: 2336 on 2677  Progress: 2337 on 2677  Progress: 2338 on 2677  Progress: 2339 on 2677  Progress: 2340 on 2677  Progress: 2341 on 2677  Progress: 2342 on 2677  Progress: 2343 on 2677  Progress: 2344 on 2677  Progress: 2345 on 2677  Progress: 2346 on 2677  Progress: 2347 on 2677  Progress: 2348 on 2677  Progress: 2349 on 2677  Progress: 2350 on 2677  Progress: 2351 on 2677  Progress: 2352 on 2677  Progress: 2353 on 2677  Progress: 2354 on 2677  Progress: 2355 on 2677  Progress: 2356 on 2677  Progress: 2357 on 2677  Progress: 2358 on 2677  Progress: 2359 on 2677  Progress: 2360 on 2677  Progress: 2361 on 2677  Progress: 2362 on 2677  Progress: 2363 on 2677  Progress: 2364 on 2677  Progress: 2365 on 2677  Progress: 2366 on 2677  Progress: 2367 on 2677  Progress: 2368 on 2677  Progress: 2369 on 2677  Progress: 2370 on 2677  Progress: 2371 on 2677  Progress: 2372 on 2677  Progress: 2373 on 2677  Progress: 2374 on 2677  Progress: 2375 on 2677  Progress: 2376 on 2677  Progress: 2377 on 2677  Progress: 2378 on 2677  Progress: 2379 on 2677  Progress: 2380 on 2677  Progress: 2381 on 2677  Progress: 2382 on 2677  Progress: 2383 on 2677  Progress: 2384 on 2677  Progress: 2385 on 2677  Progress: 2386 on 2677  Progress: 2387 on 2677  Progress: 2388 on 2677  Progress: 2389 on 2677  Progress: 2390 on 2677  Progress: 2391 on 2677  Progress: 2392 on 2677  Progress: 2393 on 2677  Progress: 2394 on 2677  Progress: 2395 on 2677  Progress: 2396 on 2677  Progress: 2397 on 2677  Progress: 2398 on 2677  Progress: 2399 on 2677  Progress: 2400 on 2677  Progress: 2401 on 2677  Progress: 2402 on 2677  Progress: 2403 on 2677  Progress: 2404 on 2677  Progress: 2405 on 2677  Progress: 2406 on 2677  Progress: 2407 on 2677  Progress: 2408 on 2677  Progress: 2409 on 2677  Progress: 2410 on 2677  Progress: 2411 on 2677  Progress: 2412 on 2677  Progress: 2413 on 2677  Progress: 2414 on 2677  Progress: 2415 on 2677  Progress: 2416 on 2677  Progress: 2417 on 2677  Progress: 2418 on 2677  Progress: 2419 on 2677  Progress: 2420 on 2677  Progress: 2421 on 2677  Progress: 2422 on 2677  Progress: 2423 on 2677  Progress: 2424 on 2677  Progress: 2425 on 2677  Progress: 2426 on 2677  Progress: 2427 on 2677  Progress: 2428 on 2677  Progress: 2429 on 2677  Progress: 2430 on 2677  Progress: 2431 on 2677  Progress: 2432 on 2677  Progress: 2433 on 2677  Progress: 2434 on 2677  Progress: 2435 on 2677  Progress: 2436 on 2677  Progress: 2437 on 2677  Progress: 2438 on 2677  Progress: 2439 on 2677  Progress: 2440 on 2677  Progress: 2441 on 2677  Progress: 2442 on 2677  Progress: 2443 on 2677  Progress: 2444 on 2677  Progress: 2445 on 2677  Progress: 2446 on 2677  Progress: 2447 on 2677  Progress: 2448 on 2677  Progress: 2449 on 2677  Progress: 2450 on 2677  Progress: 2451 on 2677  Progress: 2452 on 2677  Progress: 2453 on 2677  Progress: 2454 on 2677  Progress: 2455 on 2677  Progress: 2456 on 2677  Progress: 2457 on 2677  Progress: 2458 on 2677  Progress: 2459 on 2677  Progress: 2460 on 2677  Progress: 2461 on 2677  Progress: 2462 on 2677  Progress: 2463 on 2677  Progress: 2464 on 2677  Progress: 2465 on 2677  Progress: 2466 on 2677  Progress: 2467 on 2677  Progress: 2468 on 2677  Progress: 2469 on 2677  Progress: 2470 on 2677  Progress: 2471 on 2677  Progress: 2472 on 2677  Progress: 2473 on 2677  Progress: 2474 on 2677  Progress: 2475 on 2677  Progress: 2476 on 2677  Progress: 2477 on 2677  Progress: 2478 on 2677  Progress: 2479 on 2677  Progress: 2480 on 2677  Progress: 2481 on 2677  Progress: 2482 on 2677  Progress: 2483 on 2677  Progress: 2484 on 2677  Progress: 2485 on 2677  Progress: 2486 on 2677  Progress: 2487 on 2677  Progress: 2488 on 2677  Progress: 2489 on 2677  Progress: 2490 on 2677  Progress: 2491 on 2677  Progress: 2492 on 2677  Progress: 2493 on 2677  Progress: 2494 on 2677  Progress: 2495 on 2677  Progress: 2496 on 2677  Progress: 2497 on 2677  Progress: 2498 on 2677  Progress: 2499 on 2677  Progress: 2500 on 2677  Progress: 2501 on 2677  Progress: 2502 on 2677  Progress: 2503 on 2677  Progress: 2504 on 2677  Progress: 2505 on 2677  Progress: 2506 on 2677  Progress: 2507 on 2677  Progress: 2508 on 2677  Progress: 2509 on 2677  Progress: 2510 on 2677  Progress: 2511 on 2677  Progress: 2512 on 2677  Progress: 2513 on 2677  Progress: 2514 on 2677  Progress: 2515 on 2677  Progress: 2516 on 2677  Progress: 2517 on 2677  Progress: 2518 on 2677  Progress: 2519 on 2677  Progress: 2520 on 2677  Progress: 2521 on 2677  Progress: 2522 on 2677  Progress: 2523 on 2677  Progress: 2524 on 2677  Progress: 2525 on 2677  Progress: 2526 on 2677  Progress: 2527 on 2677  Progress: 2528 on 2677  Progress: 2529 on 2677  Progress: 2530 on 2677  Progress: 2531 on 2677  Progress: 2532 on 2677  Progress: 2533 on 2677  Progress: 2534 on 2677  Progress: 2535 on 2677  Progress: 2536 on 2677  Progress: 2537 on 2677  Progress: 2538 on 2677  Progress: 2539 on 2677  Progress: 2540 on 2677  Progress: 2541 on 2677  Progress: 2542 on 2677  Progress: 2543 on 2677  Progress: 2544 on 2677  Progress: 2545 on 2677  Progress: 2546 on 2677  Progress: 2547 on 2677  Progress: 2548 on 2677  Progress: 2549 on 2677  Progress: 2550 on 2677  Progress: 2551 on 2677  Progress: 2552 on 2677  Progress: 2553 on 2677  Progress: 2554 on 2677  Progress: 2555 on 2677  Progress: 2556 on 2677  Progress: 2557 on 2677  Progress: 2558 on 2677  Progress: 2559 on 2677  Progress: 2560 on 2677  Progress: 2561 on 2677  Progress: 2562 on 2677  Progress: 2563 on 2677  Progress: 2564 on 2677  Progress: 2565 on 2677  Progress: 2566 on 2677  Progress: 2567 on 2677  Progress: 2568 on 2677  Progress: 2569 on 2677  Progress: 2570 on 2677  Progress: 2571 on 2677  Progress: 2572 on 2677  Progress: 2573 on 2677  Progress: 2574 on 2677  Progress: 2575 on 2677  Progress: 2576 on 2677  Progress: 2577 on 2677  Progress: 2578 on 2677  Progress: 2579 on 2677  Progress: 2580 on 2677  Progress: 2581 on 2677  Progress: 2582 on 2677  Progress: 2583 on 2677  Progress: 2584 on 2677  Progress: 2585 on 2677  Progress: 2586 on 2677  Progress: 2587 on 2677  Progress: 2588 on 2677  Progress: 2589 on 2677  Progress: 2590 on 2677  Progress: 2591 on 2677  Progress: 2592 on 2677  Progress: 2593 on 2677  Progress: 2594 on 2677  Progress: 2595 on 2677  Progress: 2596 on 2677  Progress: 2597 on 2677  Progress: 2598 on 2677  Progress: 2599 on 2677  Progress: 2600 on 2677  Progress: 2601 on 2677  Progress: 2602 on 2677  Progress: 2603 on 2677  Progress: 2604 on 2677  Progress: 2605 on 2677  Progress: 2606 on 2677  Progress: 2607 on 2677  Progress: 2608 on 2677  Progress: 2609 on 2677  Progress: 2610 on 2677  Progress: 2611 on 2677  Progress: 2612 on 2677  Progress: 2613 on 2677  Progress: 2614 on 2677  Progress: 2615 on 2677  Progress: 2616 on 2677  Progress: 2617 on 2677  Progress: 2618 on 2677  Progress: 2619 on 2677  Progress: 2620 on 2677  Progress: 2621 on 2677  Progress: 2622 on 2677  Progress: 2623 on 2677  Progress: 2624 on 2677  Progress: 2625 on 2677  Progress: 2626 on 2677  Progress: 2627 on 2677  Progress: 2628 on 2677  Progress: 2629 on 2677  Progress: 2630 on 2677  Progress: 2631 on 2677  Progress: 2632 on 2677  Progress: 2633 on 2677  Progress: 2634 on 2677  Progress: 2635 on 2677  Progress: 2636 on 2677  Progress: 2637 on 2677  Progress: 2638 on 2677  Progress: 2639 on 2677  Progress: 2640 on 2677  Progress: 2641 on 2677  Progress: 2642 on 2677  Progress: 2643 on 2677  Progress: 2644 on 2677  Progress: 2645 on 2677  Progress: 2646 on 2677  Progress: 2647 on 2677  Progress: 2648 on 2677  Progress: 2649 on 2677  Progress: 2650 on 2677  Progress: 2651 on 2677  Progress: 2652 on 2677  Progress: 2653 on 2677  Progress: 2654 on 2677  Progress: 2655 on 2677  Progress: 2656 on 2677  Progress: 2657 on 2677  Progress: 2658 on 2677  Progress: 2659 on 2677  Progress: 2660 on 2677  Progress: 2661 on 2677  Progress: 2662 on 2677  Progress: 2663 on 2677  Progress: 2664 on 2677  Progress: 2665 on 2677  Progress: 2666 on 2677  Progress: 2667 on 2677  Progress: 2668 on 2677  Progress: 2669 on 2677  Progress: 2670 on 2677  Progress: 2671 on 2677  Progress: 2672 on 2677  Progress: 2673 on 2677  Progress: 2674 on 2677  Progress: 2675 on 2677  Progress: 2676 on 2677  Progress: 2677 on 2677  
za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),as.character(miejsce_wydania)),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu)

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(!grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa|dotycz|pol",X500,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
  
#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,AM_AUTOR_ID,AM_NAZWISKO,AM_IMIE),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL")
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(noquote(kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700)",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700)",sep = "# ")),as.character(polaczone$za_adnotacje))
#korekta automatycznego IOK
automatyczny_IOK <- polaczone %>%
  mutate(czy_tyt_oryg = (!grepl("polsk",DZ_NAZWA)&!is.na(za_tytul_oryginalu))|grepl("polsk",DZ_NAZWA)) %>%
  filter(za_adnotacje==""&am_nazwisko!="NA"&!grepl("pseud|nazw",za_opis_fizyczny_ksiazki)&!grepl("\\|",am_nazwisko)&czy_tyt_oryg==TRUE) %>%
  select(rekord_BN) %>%
  unique() %>%
  filter(rekord_BN %notin% data$ZA_UWAGI[data$czy_automatycznie=="nie"]) %>%
  mutate(automatyczny_import = "tak")

write.csv2(automatyczny_IOK, "C:/Users/Cezary/Desktop/imp_2009_automatyczne_przedmiotowe.csv", row.names = F, na = '', fileEncoding = 'UTF-8')

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}
Progress:  1 on 16  Progress:  2 on 16  Progress:  3 on 16  Progress:  4 on 16  Progress:  5 on 16  Progress:  6 on 16  Progress:  7 on 16  Progress:  8 on 16  Progress:  9 on 16  Progress: 10 on 16  Progress: 11 on 16  Progress: 12 on 16  Progress: 13 on 16  Progress: 14 on 16  Progress: 15 on 16  Progress: 16 on 16  
out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

#przypisanie do automatycznego OK redaktora "automat"
out <- out %>%
  mutate(pracownik = ifelse(rekord_BN %in% automatyczny_IOK$rekord_BN,"AUTOMAT",as.character(pracownik))) %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))

x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/Cezary/Desktop/2009_przedmiotowa_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
Progress: 1 on 2  Progress: 2 on 2  
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="antologia") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_ant",sep = ""))
#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  mutate(AM_AUTOR_ID = NA,
         AM_NAZWISKO = NA,
         AM_IMIE = NA)

#adnotacje z autorów
#w antologii adnotacja musi być wcześniej, żeby na górze było info o tekstach autorów

ZA_ADNOTACJE <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- ZA_ADNOTACJE %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(ZA_ADNOTACJE$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
#tutaj może być błąd ze względu na brak kolumny $b, wtedy należy zmienić linię z selectem i zakomentować linię: mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
ZA_ADNOTACJE <- marc_field_100 %>%
  #select(ZA_UWAGI,`$a`,`$b`) %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  #mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  unique() %>%
  mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
  unite("ZA_ADNOTACJE", AM_IMIE:AM_NAZWISKO, sep = " ") %>%
  group_by(ZA_UWAGI) %>%
  mutate(ZA_ADNOTACJE = paste("[Teksty aut.:]",paste(ZA_ADNOTACJE,collapse = ", "),sep = " ")) %>%
  ungroup() %>%
  unique() %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(ZA_TYTUL = paste(`$a`,`$b`,`$n`,`$p`,sep = ""))

marc_field_245 <- marc_field_245 %>%
  mutate(ZA_TYTUL = paste(`$a`,`$b`,`$n`,`$p`,sep = " "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". ")) %>%
  select(ZA_UWAGI,ZA_TYTUL)
#dopisanie gatunku do przedmiotowej na podstawie 655 i 650  
gatunki_pbl <- data.frame(gatunek = c("aforyzm", "album", "antologia", "autobiografia", "dziennik", "esej", "felieton", "inne", "kazanie", "list", "miniatura prozą", "opowiadanie", "poemat", "powieść", "proza", "proza poetycka", "reportaż", "rozmyślanie religijne", "rysunek, obraz", "scenariusz", "szkic", "tekst biblijny", "tekst dramatyczny", "dramat", "wiersz", "wspomnienia", "wypowiedź", "pamiętniki", "poezja", "literatura podróżnicza", "satyra", "piosenka"))

#dramat, pamiętniki, poezja, literatura podróżnicza, satyra, piosenka
gatunki_bn <- data %>%
  select(ZA_UWAGI,X655,X650)

gatunki_bn <- sqldf("select *
                    from gatunki_bn
                    left join gatunki_pbl on lower(gatunki_bn.X655) like '%'||gatunki_pbl.gatunek||'%'")
gatunki_bn <- sqldf("select *
                      from gatunki_bn
                      left join gatunki_pbl on lower(gatunki_bn.X650) like '%'||gatunki_pbl.gatunek||'%'")
colnames(gatunki_bn)[5] <- "gatunek2"
gatunki_bn <- gatunki_bn %>%
  mutate(gatunek = ifelse(is.na(gatunek)&!is.na(gatunek2),as.character(gatunek2),as.character(gatunek))) %>%
  filter(!is.na(gatunek)) %>%
  select(ZA_UWAGI,gatunek) %>%
  mutate(gatunek = ifelse(gatunek=="dramat","tekst dramatyczny",
                          ifelse(gatunek=="pamiętniki","wspomnienia",
                                 ifelse(gatunek=="poezja","wiersz",
                                        ifelse(gatunek=="literatura podróżnicza","reportaż",
                                               ifelse(gatunek=="piosenka","wiersz",as.character(gatunek))))))) %>%
  group_by(ZA_UWAGI) %>%
  mutate(gatunek = paste(gatunek,collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(gatunek = gsub("(^.)","\\U\\1",perl = TRUE, gatunek))
#połączenie tytułu z gatunkiem
za_tytul <- marc_field_245 %>%
  left_join(.,gatunki_bn,by="ZA_UWAGI") %>%
  mutate(ZA_TYTUL = ifelse(!is.na(gatunek)&substr(ZA_TYTUL,nchar(ZA_TYTUL),nchar(ZA_TYTUL))==".",paste(ZA_TYTUL," [",gatunek,"]",sep = ""),
                           ifelse(!is.na(gatunek)&substr(ZA_TYTUL,nchar(ZA_TYTUL),nchar(ZA_TYTUL))!=".",paste(ZA_TYTUL,". [",gatunek,"]",sep = ""),as.character(ZA_TYTUL)))) %>%
  select(ZA_UWAGI,ZA_TYTUL)
#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_246 <- marc_field_246 %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(X246 = paste(`$a`,`$b`,`$n`,`$p`,sep = "")) %>%
  mutate(X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... ")) %>%
  select(ZA_UWAGI, X246)

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)

#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}
Progress:   1 on 981  Progress:   2 on 981  Progress:   3 on 981  Progress:   4 on 981  Progress:   5 on 981  Progress:   6 on 981  Progress:   7 on 981  Progress:   8 on 981  Progress:   9 on 981  Progress:  10 on 981  Progress:  11 on 981  Progress:  12 on 981  Progress:  13 on 981  Progress:  14 on 981  Progress:  15 on 981  Progress:  16 on 981  Progress:  17 on 981  Progress:  18 on 981  Progress:  19 on 981  Progress:  20 on 981  Progress:  21 on 981  Progress:  22 on 981  Progress:  23 on 981  Progress:  24 on 981  Progress:  25 on 981  Progress:  26 on 981  Progress:  27 on 981  Progress:  28 on 981  Progress:  29 on 981  Progress:  30 on 981  Progress:  31 on 981  Progress:  32 on 981  Progress:  33 on 981  Progress:  34 on 981  Progress:  35 on 981  Progress:  36 on 981  Progress:  37 on 981  Progress:  38 on 981  Progress:  39 on 981  Progress:  40 on 981  Progress:  41 on 981  Progress:  42 on 981  Progress:  43 on 981  Progress:  44 on 981  Progress:  45 on 981  Progress:  46 on 981  Progress:  47 on 981  Progress:  48 on 981  Progress:  49 on 981  Progress:  50 on 981  Progress:  51 on 981  Progress:  52 on 981  Progress:  53 on 981  Progress:  54 on 981  Progress:  55 on 981  Progress:  56 on 981  Progress:  57 on 981  Progress:  58 on 981  Progress:  59 on 981  Progress:  60 on 981  Progress:  61 on 981  Progress:  62 on 981  Progress:  63 on 981  Progress:  64 on 981  Progress:  65 on 981  Progress:  66 on 981  Progress:  67 on 981  Progress:  68 on 981  Progress:  69 on 981  Progress:  70 on 981  Progress:  71 on 981  Progress:  72 on 981  Progress:  73 on 981  Progress:  74 on 981  Progress:  75 on 981  Progress:  76 on 981  Progress:  77 on 981  Progress:  78 on 981  Progress:  79 on 981  Progress:  80 on 981  Progress:  81 on 981  Progress:  82 on 981  Progress:  83 on 981  Progress:  84 on 981  Progress:  85 on 981  Progress:  86 on 981  Progress:  87 on 981  Progress:  88 on 981  Progress:  89 on 981  Progress:  90 on 981  Progress:  91 on 981  Progress:  92 on 981  Progress:  93 on 981  Progress:  94 on 981  Progress:  95 on 981  Progress:  96 on 981  Progress:  97 on 981  Progress:  98 on 981  Progress:  99 on 981  Progress: 100 on 981  Progress: 101 on 981  Progress: 102 on 981  Progress: 103 on 981  Progress: 104 on 981  Progress: 105 on 981  Progress: 106 on 981  Progress: 107 on 981  Progress: 108 on 981  Progress: 109 on 981  Progress: 110 on 981  Progress: 111 on 981  Progress: 112 on 981  Progress: 113 on 981  Progress: 114 on 981  Progress: 115 on 981  Progress: 116 on 981  Progress: 117 on 981  Progress: 118 on 981  Progress: 119 on 981  Progress: 120 on 981  Progress: 121 on 981  Progress: 122 on 981  Progress: 123 on 981  Progress: 124 on 981  Progress: 125 on 981  Progress: 126 on 981  Progress: 127 on 981  Progress: 128 on 981  Progress: 129 on 981  Progress: 130 on 981  Progress: 131 on 981  Progress: 132 on 981  Progress: 133 on 981  Progress: 134 on 981  Progress: 135 on 981  Progress: 136 on 981  Progress: 137 on 981  Progress: 138 on 981  Progress: 139 on 981  Progress: 140 on 981  Progress: 141 on 981  Progress: 142 on 981  Progress: 143 on 981  Progress: 144 on 981  Progress: 145 on 981  Progress: 146 on 981  Progress: 147 on 981  Progress: 148 on 981  Progress: 149 on 981  Progress: 150 on 981  Progress: 151 on 981  Progress: 152 on 981  Progress: 153 on 981  Progress: 154 on 981  Progress: 155 on 981  Progress: 156 on 981  Progress: 157 on 981  Progress: 158 on 981  Progress: 159 on 981  Progress: 160 on 981  Progress: 161 on 981  Progress: 162 on 981  Progress: 163 on 981  Progress: 164 on 981  Progress: 165 on 981  Progress: 166 on 981  Progress: 167 on 981  Progress: 168 on 981  Progress: 169 on 981  Progress: 170 on 981  Progress: 171 on 981  Progress: 172 on 981  Progress: 173 on 981  Progress: 174 on 981  Progress: 175 on 981  Progress: 176 on 981  Progress: 177 on 981  Progress: 178 on 981  Progress: 179 on 981  Progress: 180 on 981  Progress: 181 on 981  Progress: 182 on 981  Progress: 183 on 981  Progress: 184 on 981  Progress: 185 on 981  Progress: 186 on 981  Progress: 187 on 981  Progress: 188 on 981  Progress: 189 on 981  Progress: 190 on 981  Progress: 191 on 981  Progress: 192 on 981  Progress: 193 on 981  Progress: 194 on 981  Progress: 195 on 981  Progress: 196 on 981  Progress: 197 on 981  Progress: 198 on 981  Progress: 199 on 981  Progress: 200 on 981  Progress: 201 on 981  Progress: 202 on 981  Progress: 203 on 981  Progress: 204 on 981  Progress: 205 on 981  Progress: 206 on 981  Progress: 207 on 981  Progress: 208 on 981  Progress: 209 on 981  Progress: 210 on 981  Progress: 211 on 981  Progress: 212 on 981  Progress: 213 on 981  Progress: 214 on 981  Progress: 215 on 981  Progress: 216 on 981  Progress: 217 on 981  Progress: 218 on 981  Progress: 219 on 981  Progress: 220 on 981  Progress: 221 on 981  Progress: 222 on 981  Progress: 223 on 981  Progress: 224 on 981  Progress: 225 on 981  Progress: 226 on 981  Progress: 227 on 981  Progress: 228 on 981  Progress: 229 on 981  Progress: 230 on 981  Progress: 231 on 981  Progress: 232 on 981  Progress: 233 on 981  Progress: 234 on 981  Progress: 235 on 981  Progress: 236 on 981  Progress: 237 on 981  Progress: 238 on 981  Progress: 239 on 981  Progress: 240 on 981  Progress: 241 on 981  Progress: 242 on 981  Progress: 243 on 981  Progress: 244 on 981  Progress: 245 on 981  Progress: 246 on 981  Progress: 247 on 981  Progress: 248 on 981  Progress: 249 on 981  Progress: 250 on 981  Progress: 251 on 981  Progress: 252 on 981  Progress: 253 on 981  Progress: 254 on 981  Progress: 255 on 981  Progress: 256 on 981  Progress: 257 on 981  Progress: 258 on 981  Progress: 259 on 981  Progress: 260 on 981  Progress: 261 on 981  Progress: 262 on 981  Progress: 263 on 981  Progress: 264 on 981  Progress: 265 on 981  Progress: 266 on 981  Progress: 267 on 981  Progress: 268 on 981  Progress: 269 on 981  Progress: 270 on 981  Progress: 271 on 981  Progress: 272 on 981  Progress: 273 on 981  Progress: 274 on 981  Progress: 275 on 981  Progress: 276 on 981  Progress: 277 on 981  Progress: 278 on 981  Progress: 279 on 981  Progress: 280 on 981  Progress: 281 on 981  Progress: 282 on 981  Progress: 283 on 981  Progress: 284 on 981  Progress: 285 on 981  Progress: 286 on 981  Progress: 287 on 981  Progress: 288 on 981  Progress: 289 on 981  Progress: 290 on 981  Progress: 291 on 981  Progress: 292 on 981  Progress: 293 on 981  Progress: 294 on 981  Progress: 295 on 981  Progress: 296 on 981  Progress: 297 on 981  Progress: 298 on 981  Progress: 299 on 981  Progress: 300 on 981  Progress: 301 on 981  Progress: 302 on 981  Progress: 303 on 981  Progress: 304 on 981  Progress: 305 on 981  Progress: 306 on 981  Progress: 307 on 981  Progress: 308 on 981  Progress: 309 on 981  Progress: 310 on 981  Progress: 311 on 981  Progress: 312 on 981  Progress: 313 on 981  Progress: 314 on 981  Progress: 315 on 981  Progress: 316 on 981  Progress: 317 on 981  Progress: 318 on 981  Progress: 319 on 981  Progress: 320 on 981  Progress: 321 on 981  Progress: 322 on 981  Progress: 323 on 981  Progress: 324 on 981  Progress: 325 on 981  Progress: 326 on 981  Progress: 327 on 981  Progress: 328 on 981  Progress: 329 on 981  Progress: 330 on 981  Progress: 331 on 981  Progress: 332 on 981  Progress: 333 on 981  Progress: 334 on 981  Progress: 335 on 981  Progress: 336 on 981  Progress: 337 on 981  Progress: 338 on 981  Progress: 339 on 981  Progress: 340 on 981  Progress: 341 on 981  Progress: 342 on 981  Progress: 343 on 981  Progress: 344 on 981  Progress: 345 on 981  Progress: 346 on 981  Progress: 347 on 981  Progress: 348 on 981  Progress: 349 on 981  Progress: 350 on 981  Progress: 351 on 981  Progress: 352 on 981  Progress: 353 on 981  Progress: 354 on 981  Progress: 355 on 981  Progress: 356 on 981  Progress: 357 on 981  Progress: 358 on 981  Progress: 359 on 981  Progress: 360 on 981  Progress: 361 on 981  Progress: 362 on 981  Progress: 363 on 981  Progress: 364 on 981  Progress: 365 on 981  Progress: 366 on 981  Progress: 367 on 981  Progress: 368 on 981  Progress: 369 on 981  Progress: 370 on 981  Progress: 371 on 981  Progress: 372 on 981  Progress: 373 on 981  Progress: 374 on 981  Progress: 375 on 981  Progress: 376 on 981  Progress: 377 on 981  Progress: 378 on 981  Progress: 379 on 981  Progress: 380 on 981  Progress: 381 on 981  Progress: 382 on 981  Progress: 383 on 981  Progress: 384 on 981  Progress: 385 on 981  Progress: 386 on 981  Progress: 387 on 981  Progress: 388 on 981  Progress: 389 on 981  Progress: 390 on 981  Progress: 391 on 981  Progress: 392 on 981  Progress: 393 on 981  Progress: 394 on 981  Progress: 395 on 981  Progress: 396 on 981  Progress: 397 on 981  Progress: 398 on 981  Progress: 399 on 981  Progress: 400 on 981  Progress: 401 on 981  Progress: 402 on 981  Progress: 403 on 981  Progress: 404 on 981  Progress: 405 on 981  Progress: 406 on 981  Progress: 407 on 981  Progress: 408 on 981  Progress: 409 on 981  Progress: 410 on 981  Progress: 411 on 981  Progress: 412 on 981  Progress: 413 on 981  Progress: 414 on 981  Progress: 415 on 981  Progress: 416 on 981  Progress: 417 on 981  Progress: 418 on 981  Progress: 419 on 981  Progress: 420 on 981  Progress: 421 on 981  Progress: 422 on 981  Progress: 423 on 981  Progress: 424 on 981  Progress: 425 on 981  Progress: 426 on 981  Progress: 427 on 981  Progress: 428 on 981  Progress: 429 on 981  Progress: 430 on 981  Progress: 431 on 981  Progress: 432 on 981  Progress: 433 on 981  Progress: 434 on 981  Progress: 435 on 981  Progress: 436 on 981  Progress: 437 on 981  Progress: 438 on 981  Progress: 439 on 981  Progress: 440 on 981  Progress: 441 on 981  Progress: 442 on 981  Progress: 443 on 981  Progress: 444 on 981  Progress: 445 on 981  Progress: 446 on 981  Progress: 447 on 981  Progress: 448 on 981  Progress: 449 on 981  Progress: 450 on 981  Progress: 451 on 981  Progress: 452 on 981  Progress: 453 on 981  Progress: 454 on 981  Progress: 455 on 981  Progress: 456 on 981  Progress: 457 on 981  Progress: 458 on 981  Progress: 459 on 981  Progress: 460 on 981  Progress: 461 on 981  Progress: 462 on 981  Progress: 463 on 981  Progress: 464 on 981  Progress: 465 on 981  Progress: 466 on 981  Progress: 467 on 981  Progress: 468 on 981  Progress: 469 on 981  Progress: 470 on 981  Progress: 471 on 981  Progress: 472 on 981  Progress: 473 on 981  Progress: 474 on 981  Progress: 475 on 981  Progress: 476 on 981  Progress: 477 on 981  Progress: 478 on 981  Progress: 479 on 981  Progress: 480 on 981  Progress: 481 on 981  Progress: 482 on 981  Progress: 483 on 981  Progress: 484 on 981  Progress: 485 on 981  Progress: 486 on 981  Progress: 487 on 981  Progress: 488 on 981  Progress: 489 on 981  Progress: 490 on 981  Progress: 491 on 981  Progress: 492 on 981  Progress: 493 on 981  Progress: 494 on 981  Progress: 495 on 981  Progress: 496 on 981  Progress: 497 on 981  Progress: 498 on 981  Progress: 499 on 981  Progress: 500 on 981  Progress: 501 on 981  Progress: 502 on 981  Progress: 503 on 981  Progress: 504 on 981  Progress: 505 on 981  Progress: 506 on 981  Progress: 507 on 981  Progress: 508 on 981  Progress: 509 on 981  Progress: 510 on 981  Progress: 511 on 981  Progress: 512 on 981  Progress: 513 on 981  Progress: 514 on 981  Progress: 515 on 981  Progress: 516 on 981  Progress: 517 on 981  Progress: 518 on 981  Progress: 519 on 981  Progress: 520 on 981  Progress: 521 on 981  Progress: 522 on 981  Progress: 523 on 981  Progress: 524 on 981  Progress: 525 on 981  Progress: 526 on 981  Progress: 527 on 981  Progress: 528 on 981  Progress: 529 on 981  Progress: 530 on 981  Progress: 531 on 981  Progress: 532 on 981  Progress: 533 on 981  Progress: 534 on 981  Progress: 535 on 981  Progress: 536 on 981  Progress: 537 on 981  Progress: 538 on 981  Progress: 539 on 981  Progress: 540 on 981  Progress: 541 on 981  Progress: 542 on 981  Progress: 543 on 981  Progress: 544 on 981  Progress: 545 on 981  Progress: 546 on 981  Progress: 547 on 981  Progress: 548 on 981  Progress: 549 on 981  Progress: 550 on 981  Progress: 551 on 981  Progress: 552 on 981  Progress: 553 on 981  Progress: 554 on 981  Progress: 555 on 981  Progress: 556 on 981  Progress: 557 on 981  Progress: 558 on 981  Progress: 559 on 981  Progress: 560 on 981  Progress: 561 on 981  Progress: 562 on 981  Progress: 563 on 981  Progress: 564 on 981  Progress: 565 on 981  Progress: 566 on 981  Progress: 567 on 981  Progress: 568 on 981  Progress: 569 on 981  Progress: 570 on 981  Progress: 571 on 981  Progress: 572 on 981  Progress: 573 on 981  Progress: 574 on 981  Progress: 575 on 981  Progress: 576 on 981  Progress: 577 on 981  Progress: 578 on 981  Progress: 579 on 981  Progress: 580 on 981  Progress: 581 on 981  Progress: 582 on 981  Progress: 583 on 981  Progress: 584 on 981  Progress: 585 on 981  Progress: 586 on 981  Progress: 587 on 981  Progress: 588 on 981  Progress: 589 on 981  Progress: 590 on 981  Progress: 591 on 981  Progress: 592 on 981  Progress: 593 on 981  Progress: 594 on 981  Progress: 595 on 981  Progress: 596 on 981  Progress: 597 on 981  Progress: 598 on 981  Progress: 599 on 981  Progress: 600 on 981  Progress: 601 on 981  Progress: 602 on 981  Progress: 603 on 981  Progress: 604 on 981  Progress: 605 on 981  Progress: 606 on 981  Progress: 607 on 981  Progress: 608 on 981  Progress: 609 on 981  Progress: 610 on 981  Progress: 611 on 981  Progress: 612 on 981  Progress: 613 on 981  Progress: 614 on 981  Progress: 615 on 981  Progress: 616 on 981  Progress: 617 on 981  Progress: 618 on 981  Progress: 619 on 981  Progress: 620 on 981  Progress: 621 on 981  Progress: 622 on 981  Progress: 623 on 981  Progress: 624 on 981  Progress: 625 on 981  Progress: 626 on 981  Progress: 627 on 981  Progress: 628 on 981  Progress: 629 on 981  Progress: 630 on 981  Progress: 631 on 981  Progress: 632 on 981  Progress: 633 on 981  Progress: 634 on 981  Progress: 635 on 981  Progress: 636 on 981  Progress: 637 on 981  Progress: 638 on 981  Progress: 639 on 981  Progress: 640 on 981  Progress: 641 on 981  Progress: 642 on 981  Progress: 643 on 981  Progress: 644 on 981  Progress: 645 on 981  Progress: 646 on 981  Progress: 647 on 981  Progress: 648 on 981  Progress: 649 on 981  Progress: 650 on 981  Progress: 651 on 981  Progress: 652 on 981  Progress: 653 on 981  Progress: 654 on 981  Progress: 655 on 981  Progress: 656 on 981  Progress: 657 on 981  Progress: 658 on 981  Progress: 659 on 981  Progress: 660 on 981  Progress: 661 on 981  Progress: 662 on 981  Progress: 663 on 981  Progress: 664 on 981  Progress: 665 on 981  Progress: 666 on 981  Progress: 667 on 981  Progress: 668 on 981  Progress: 669 on 981  Progress: 670 on 981  Progress: 671 on 981  Progress: 672 on 981  Progress: 673 on 981  Progress: 674 on 981  Progress: 675 on 981  Progress: 676 on 981  Progress: 677 on 981  Progress: 678 on 981  Progress: 679 on 981  Progress: 680 on 981  Progress: 681 on 981  Progress: 682 on 981  Progress: 683 on 981  Progress: 684 on 981  Progress: 685 on 981  Progress: 686 on 981  Progress: 687 on 981  Progress: 688 on 981  Progress: 689 on 981  Progress: 690 on 981  Progress: 691 on 981  Progress: 692 on 981  Progress: 693 on 981  Progress: 694 on 981  Progress: 695 on 981  Progress: 696 on 981  Progress: 697 on 981  Progress: 698 on 981  Progress: 699 on 981  Progress: 700 on 981  Progress: 701 on 981  Progress: 702 on 981  Progress: 703 on 981  Progress: 704 on 981  Progress: 705 on 981  Progress: 706 on 981  Progress: 707 on 981  Progress: 708 on 981  Progress: 709 on 981  Progress: 710 on 981  Progress: 711 on 981  Progress: 712 on 981  Progress: 713 on 981  Progress: 714 on 981  Progress: 715 on 981  Progress: 716 on 981  Progress: 717 on 981  Progress: 718 on 981  Progress: 719 on 981  Progress: 720 on 981  Progress: 721 on 981  Progress: 722 on 981  Progress: 723 on 981  Progress: 724 on 981  Progress: 725 on 981  Progress: 726 on 981  Progress: 727 on 981  Progress: 728 on 981  Progress: 729 on 981  Progress: 730 on 981  Progress: 731 on 981  Progress: 732 on 981  Progress: 733 on 981  Progress: 734 on 981  Progress: 735 on 981  Progress: 736 on 981  Progress: 737 on 981  Progress: 738 on 981  Progress: 739 on 981  Progress: 740 on 981  Progress: 741 on 981  Progress: 742 on 981  Progress: 743 on 981  Progress: 744 on 981  Progress: 745 on 981  Progress: 746 on 981  Progress: 747 on 981  Progress: 748 on 981  Progress: 749 on 981  Progress: 750 on 981  Progress: 751 on 981  Progress: 752 on 981  Progress: 753 on 981  Progress: 754 on 981  Progress: 755 on 981  Progress: 756 on 981  Progress: 757 on 981  Progress: 758 on 981  Progress: 759 on 981  Progress: 760 on 981  Progress: 761 on 981  Progress: 762 on 981  Progress: 763 on 981  Progress: 764 on 981  Progress: 765 on 981  Progress: 766 on 981  Progress: 767 on 981  Progress: 768 on 981  Progress: 769 on 981  Progress: 770 on 981  Progress: 771 on 981  Progress: 772 on 981  Progress: 773 on 981  Progress: 774 on 981  Progress: 775 on 981  Progress: 776 on 981  Progress: 777 on 981  Progress: 778 on 981  Progress: 779 on 981  Progress: 780 on 981  Progress: 781 on 981  Progress: 782 on 981  Progress: 783 on 981  Progress: 784 on 981  Progress: 785 on 981  Progress: 786 on 981  Progress: 787 on 981  Progress: 788 on 981  Progress: 789 on 981  Progress: 790 on 981  Progress: 791 on 981  Progress: 792 on 981  Progress: 793 on 981  Progress: 794 on 981  Progress: 795 on 981  Progress: 796 on 981  Progress: 797 on 981  Progress: 798 on 981  Progress: 799 on 981  Progress: 800 on 981  Progress: 801 on 981  Progress: 802 on 981  Progress: 803 on 981  Progress: 804 on 981  Progress: 805 on 981  Progress: 806 on 981  Progress: 807 on 981  Progress: 808 on 981  Progress: 809 on 981  Progress: 810 on 981  Progress: 811 on 981  Progress: 812 on 981  Progress: 813 on 981  Progress: 814 on 981  Progress: 815 on 981  Progress: 816 on 981  Progress: 817 on 981  Progress: 818 on 981  Progress: 819 on 981  Progress: 820 on 981  Progress: 821 on 981  Progress: 822 on 981  Progress: 823 on 981  Progress: 824 on 981  Progress: 825 on 981  Progress: 826 on 981  Progress: 827 on 981  Progress: 828 on 981  Progress: 829 on 981  Progress: 830 on 981  Progress: 831 on 981  Progress: 832 on 981  Progress: 833 on 981  Progress: 834 on 981  Progress: 835 on 981  Progress: 836 on 981  Progress: 837 on 981  Progress: 838 on 981  Progress: 839 on 981  Progress: 840 on 981  Progress: 841 on 981  Progress: 842 on 981  Progress: 843 on 981  Progress: 844 on 981  Progress: 845 on 981  Progress: 846 on 981  Progress: 847 on 981  Progress: 848 on 981  Progress: 849 on 981  Progress: 850 on 981  Progress: 851 on 981  Progress: 852 on 981  Progress: 853 on 981  Progress: 854 on 981  Progress: 855 on 981  Progress: 856 on 981  Progress: 857 on 981  Progress: 858 on 981  Progress: 859 on 981  Progress: 860 on 981  Progress: 861 on 981  Progress: 862 on 981  Progress: 863 on 981  Progress: 864 on 981  Progress: 865 on 981  Progress: 866 on 981  Progress: 867 on 981  Progress: 868 on 981  Progress: 869 on 981  Progress: 870 on 981  Progress: 871 on 981  Progress: 872 on 981  Progress: 873 on 981  Progress: 874 on 981  Progress: 875 on 981  Progress: 876 on 981  Progress: 877 on 981  Progress: 878 on 981  Progress: 879 on 981  Progress: 880 on 981  Progress: 881 on 981  Progress: 882 on 981  Progress: 883 on 981  Progress: 884 on 981  Progress: 885 on 981  Progress: 886 on 981  Progress: 887 on 981  Progress: 888 on 981  Progress: 889 on 981  Progress: 890 on 981  Progress: 891 on 981  Progress: 892 on 981  Progress: 893 on 981  Progress: 894 on 981  Progress: 895 on 981  Progress: 896 on 981  Progress: 897 on 981  Progress: 898 on 981  Progress: 899 on 981  Progress: 900 on 981  Progress: 901 on 981  Progress: 902 on 981  Progress: 903 on 981  Progress: 904 on 981  Progress: 905 on 981  Progress: 906 on 981  Progress: 907 on 981  Progress: 908 on 981  Progress: 909 on 981  Progress: 910 on 981  Progress: 911 on 981  Progress: 912 on 981  Progress: 913 on 981  Progress: 914 on 981  Progress: 915 on 981  Progress: 916 on 981  Progress: 917 on 981  Progress: 918 on 981  Progress: 919 on 981  Progress: 920 on 981  Progress: 921 on 981  Progress: 922 on 981  Progress: 923 on 981  Progress: 924 on 981  Progress: 925 on 981  Progress: 926 on 981  Progress: 927 on 981  Progress: 928 on 981  Progress: 929 on 981  Progress: 930 on 981  Progress: 931 on 981  Progress: 932 on 981  Progress: 933 on 981  Progress: 934 on 981  Progress: 935 on 981  Progress: 936 on 981  Progress: 937 on 981  Progress: 938 on 981  Progress: 939 on 981  Progress: 940 on 981  Progress: 941 on 981  Progress: 942 on 981  Progress: 943 on 981  Progress: 944 on 981  Progress: 945 on 981  Progress: 946 on 981  Progress: 947 on 981  Progress: 948 on 981  Progress: 949 on 981  Progress: 950 on 981  Progress: 951 on 981  Progress: 952 on 981  Progress: 953 on 981  Progress: 954 on 981  Progress: 955 on 981  Progress: 956 on 981  Progress: 957 on 981  Progress: 958 on 981  Progress: 959 on 981  Progress: 960 on 981  Progress: 961 on 981  Progress: 962 on 981  Progress: 963 on 981  Progress: 964 on 981  Progress: 965 on 981  Progress: 966 on 981  Progress: 967 on 981  Progress: 968 on 981  Progress: 969 on 981  Progress: 970 on 981  Progress: 971 on 981  Progress: 972 on 981  Progress: 973 on 981  Progress: 974 on 981  Progress: 975 on 981  Progress: 976 on 981  Progress: 977 on 981  Progress: 978 on 981  Progress: 979 on 981  Progress: 980 on 981  Progress: 981 on 981  
BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}
Progress:    1 on 1028  Progress:    2 on 1028  Progress:    3 on 1028  Progress:    4 on 1028  Progress:    5 on 1028  Progress:    6 on 1028  Progress:    7 on 1028  Progress:    8 on 1028  Progress:    9 on 1028  Progress:   10 on 1028  Progress:   11 on 1028  Progress:   12 on 1028  Progress:   13 on 1028  Progress:   14 on 1028  Progress:   15 on 1028  Progress:   16 on 1028  Progress:   17 on 1028  Progress:   18 on 1028  Progress:   19 on 1028  Progress:   20 on 1028  Progress:   21 on 1028  Progress:   22 on 1028  Progress:   23 on 1028  Progress:   24 on 1028  Progress:   25 on 1028  Progress:   26 on 1028  Progress:   27 on 1028  Progress:   28 on 1028  Progress:   29 on 1028  Progress:   30 on 1028  Progress:   31 on 1028  Progress:   32 on 1028  Progress:   33 on 1028  Progress:   34 on 1028  Progress:   35 on 1028  Progress:   36 on 1028  Progress:   37 on 1028  Progress:   38 on 1028  Progress:   39 on 1028  Progress:   40 on 1028  Progress:   41 on 1028  Progress:   42 on 1028  Progress:   43 on 1028  Progress:   44 on 1028  Progress:   45 on 1028  Progress:   46 on 1028  Progress:   47 on 1028  Progress:   48 on 1028  Progress:   49 on 1028  Progress:   50 on 1028  Progress:   51 on 1028  Progress:   52 on 1028  Progress:   53 on 1028  Progress:   54 on 1028  Progress:   55 on 1028  Progress:   56 on 1028  Progress:   57 on 1028  Progress:   58 on 1028  Progress:   59 on 1028  Progress:   60 on 1028  Progress:   61 on 1028  Progress:   62 on 1028  Progress:   63 on 1028  Progress:   64 on 1028  Progress:   65 on 1028  Progress:   66 on 1028  Progress:   67 on 1028  Progress:   68 on 1028  Progress:   69 on 1028  Progress:   70 on 1028  Progress:   71 on 1028  Progress:   72 on 1028  Progress:   73 on 1028  Progress:   74 on 1028  Progress:   75 on 1028  Progress:   76 on 1028  Progress:   77 on 1028  Progress:   78 on 1028  Progress:   79 on 1028  Progress:   80 on 1028  Progress:   81 on 1028  Progress:   82 on 1028  Progress:   83 on 1028  Progress:   84 on 1028  Progress:   85 on 1028  Progress:   86 on 1028  Progress:   87 on 1028  Progress:   88 on 1028  Progress:   89 on 1028  Progress:   90 on 1028  Progress:   91 on 1028  Progress:   92 on 1028  Progress:   93 on 1028  Progress:   94 on 1028  Progress:   95 on 1028  Progress:   96 on 1028  Progress:   97 on 1028  Progress:   98 on 1028  Progress:   99 on 1028  Progress:  100 on 1028  Progress:  101 on 1028  Progress:  102 on 1028  Progress:  103 on 1028  Progress:  104 on 1028  Progress:  105 on 1028  Progress:  106 on 1028  Progress:  107 on 1028  Progress:  108 on 1028  Progress:  109 on 1028  Progress:  110 on 1028  Progress:  111 on 1028  Progress:  112 on 1028  Progress:  113 on 1028  Progress:  114 on 1028  Progress:  115 on 1028  Progress:  116 on 1028  Progress:  117 on 1028  Progress:  118 on 1028  Progress:  119 on 1028  Progress:  120 on 1028  Progress:  121 on 1028  Progress:  122 on 1028  Progress:  123 on 1028  Progress:  124 on 1028  Progress:  125 on 1028  Progress:  126 on 1028  Progress:  127 on 1028  Progress:  128 on 1028  Progress:  129 on 1028  Progress:  130 on 1028  Progress:  131 on 1028  Progress:  132 on 1028  Progress:  133 on 1028  Progress:  134 on 1028  Progress:  135 on 1028  Progress:  136 on 1028  Progress:  137 on 1028  Progress:  138 on 1028  Progress:  139 on 1028  Progress:  140 on 1028  Progress:  141 on 1028  Progress:  142 on 1028  Progress:  143 on 1028  Progress:  144 on 1028  Progress:  145 on 1028  Progress:  146 on 1028  Progress:  147 on 1028  Progress:  148 on 1028  Progress:  149 on 1028  Progress:  150 on 1028  Progress:  151 on 1028  Progress:  152 on 1028  Progress:  153 on 1028  Progress:  154 on 1028  Progress:  155 on 1028  Progress:  156 on 1028  Progress:  157 on 1028  Progress:  158 on 1028  Progress:  159 on 1028  Progress:  160 on 1028  Progress:  161 on 1028  Progress:  162 on 1028  Progress:  163 on 1028  Progress:  164 on 1028  Progress:  165 on 1028  Progress:  166 on 1028  Progress:  167 on 1028  Progress:  168 on 1028  Progress:  169 on 1028  Progress:  170 on 1028  Progress:  171 on 1028  Progress:  172 on 1028  Progress:  173 on 1028  Progress:  174 on 1028  Progress:  175 on 1028  Progress:  176 on 1028  Progress:  177 on 1028  Progress:  178 on 1028  Progress:  179 on 1028  Progress:  180 on 1028  Progress:  181 on 1028  Progress:  182 on 1028  Progress:  183 on 1028  Progress:  184 on 1028  Progress:  185 on 1028  Progress:  186 on 1028  Progress:  187 on 1028  Progress:  188 on 1028  Progress:  189 on 1028  Progress:  190 on 1028  Progress:  191 on 1028  Progress:  192 on 1028  Progress:  193 on 1028  Progress:  194 on 1028  Progress:  195 on 1028  Progress:  196 on 1028  Progress:  197 on 1028  Progress:  198 on 1028  Progress:  199 on 1028  Progress:  200 on 1028  Progress:  201 on 1028  Progress:  202 on 1028  Progress:  203 on 1028  Progress:  204 on 1028  Progress:  205 on 1028  Progress:  206 on 1028  Progress:  207 on 1028  Progress:  208 on 1028  Progress:  209 on 1028  Progress:  210 on 1028  Progress:  211 on 1028  Progress:  212 on 1028  Progress:  213 on 1028  Progress:  214 on 1028  Progress:  215 on 1028  Progress:  216 on 1028  Progress:  217 on 1028  Progress:  218 on 1028  Progress:  219 on 1028  Progress:  220 on 1028  Progress:  221 on 1028  Progress:  222 on 1028  Progress:  223 on 1028  Progress:  224 on 1028  Progress:  225 on 1028  Progress:  226 on 1028  Progress:  227 on 1028  Progress:  228 on 1028  Progress:  229 on 1028  Progress:  230 on 1028  Progress:  231 on 1028  Progress:  232 on 1028  Progress:  233 on 1028  Progress:  234 on 1028  Progress:  235 on 1028  Progress:  236 on 1028  Progress:  237 on 1028  Progress:  238 on 1028  Progress:  239 on 1028  Progress:  240 on 1028  Progress:  241 on 1028  Progress:  242 on 1028  Progress:  243 on 1028  Progress:  244 on 1028  Progress:  245 on 1028  Progress:  246 on 1028  Progress:  247 on 1028  Progress:  248 on 1028  Progress:  249 on 1028  Progress:  250 on 1028  Progress:  251 on 1028  Progress:  252 on 1028  Progress:  253 on 1028  Progress:  254 on 1028  Progress:  255 on 1028  Progress:  256 on 1028  Progress:  257 on 1028  Progress:  258 on 1028  Progress:  259 on 1028  Progress:  260 on 1028  Progress:  261 on 1028  Progress:  262 on 1028  Progress:  263 on 1028  Progress:  264 on 1028  Progress:  265 on 1028  Progress:  266 on 1028  Progress:  267 on 1028  Progress:  268 on 1028  Progress:  269 on 1028  Progress:  270 on 1028  Progress:  271 on 1028  Progress:  272 on 1028  Progress:  273 on 1028  Progress:  274 on 1028  Progress:  275 on 1028  Progress:  276 on 1028  Progress:  277 on 1028  Progress:  278 on 1028  Progress:  279 on 1028  Progress:  280 on 1028  Progress:  281 on 1028  Progress:  282 on 1028  Progress:  283 on 1028  Progress:  284 on 1028  Progress:  285 on 1028  Progress:  286 on 1028  Progress:  287 on 1028  Progress:  288 on 1028  Progress:  289 on 1028  Progress:  290 on 1028  Progress:  291 on 1028  Progress:  292 on 1028  Progress:  293 on 1028  Progress:  294 on 1028  Progress:  295 on 1028  Progress:  296 on 1028  Progress:  297 on 1028  Progress:  298 on 1028  Progress:  299 on 1028  Progress:  300 on 1028  Progress:  301 on 1028  Progress:  302 on 1028  Progress:  303 on 1028  Progress:  304 on 1028  Progress:  305 on 1028  Progress:  306 on 1028  Progress:  307 on 1028  Progress:  308 on 1028  Progress:  309 on 1028  Progress:  310 on 1028  Progress:  311 on 1028  Progress:  312 on 1028  Progress:  313 on 1028  Progress:  314 on 1028  Progress:  315 on 1028  Progress:  316 on 1028  Progress:  317 on 1028  Progress:  318 on 1028  Progress:  319 on 1028  Progress:  320 on 1028  Progress:  321 on 1028  Progress:  322 on 1028  Progress:  323 on 1028  Progress:  324 on 1028  Progress:  325 on 1028  Progress:  326 on 1028  Progress:  327 on 1028  Progress:  328 on 1028  Progress:  329 on 1028  Progress:  330 on 1028  Progress:  331 on 1028  Progress:  332 on 1028  Progress:  333 on 1028  Progress:  334 on 1028  Progress:  335 on 1028  Progress:  336 on 1028  Progress:  337 on 1028  Progress:  338 on 1028  Progress:  339 on 1028  Progress:  340 on 1028  Progress:  341 on 1028  Progress:  342 on 1028  Progress:  343 on 1028  Progress:  344 on 1028  Progress:  345 on 1028  Progress:  346 on 1028  Progress:  347 on 1028  Progress:  348 on 1028  Progress:  349 on 1028  Progress:  350 on 1028  Progress:  351 on 1028  Progress:  352 on 1028  Progress:  353 on 1028  Progress:  354 on 1028  Progress:  355 on 1028  Progress:  356 on 1028  Progress:  357 on 1028  Progress:  358 on 1028  Progress:  359 on 1028  Progress:  360 on 1028  Progress:  361 on 1028  Progress:  362 on 1028  Progress:  363 on 1028  Progress:  364 on 1028  Progress:  365 on 1028  Progress:  366 on 1028  Progress:  367 on 1028  Progress:  368 on 1028  Progress:  369 on 1028  Progress:  370 on 1028  Progress:  371 on 1028  Progress:  372 on 1028  Progress:  373 on 1028  Progress:  374 on 1028  Progress:  375 on 1028  Progress:  376 on 1028  Progress:  377 on 1028  Progress:  378 on 1028  Progress:  379 on 1028  Progress:  380 on 1028  Progress:  381 on 1028  Progress:  382 on 1028  Progress:  383 on 1028  Progress:  384 on 1028  Progress:  385 on 1028  Progress:  386 on 1028  Progress:  387 on 1028  Progress:  388 on 1028  Progress:  389 on 1028  Progress:  390 on 1028  Progress:  391 on 1028  Progress:  392 on 1028  Progress:  393 on 1028  Progress:  394 on 1028  Progress:  395 on 1028  Progress:  396 on 1028  Progress:  397 on 1028  Progress:  398 on 1028  Progress:  399 on 1028  Progress:  400 on 1028  Progress:  401 on 1028  Progress:  402 on 1028  Progress:  403 on 1028  Progress:  404 on 1028  Progress:  405 on 1028  Progress:  406 on 1028  Progress:  407 on 1028  Progress:  408 on 1028  Progress:  409 on 1028  Progress:  410 on 1028  Progress:  411 on 1028  Progress:  412 on 1028  Progress:  413 on 1028  Progress:  414 on 1028  Progress:  415 on 1028  Progress:  416 on 1028  Progress:  417 on 1028  Progress:  418 on 1028  Progress:  419 on 1028  Progress:  420 on 1028  Progress:  421 on 1028  Progress:  422 on 1028  Progress:  423 on 1028  Progress:  424 on 1028  Progress:  425 on 1028  Progress:  426 on 1028  Progress:  427 on 1028  Progress:  428 on 1028  Progress:  429 on 1028  Progress:  430 on 1028  Progress:  431 on 1028  Progress:  432 on 1028  Progress:  433 on 1028  Progress:  434 on 1028  Progress:  435 on 1028  Progress:  436 on 1028  Progress:  437 on 1028  Progress:  438 on 1028  Progress:  439 on 1028  Progress:  440 on 1028  Progress:  441 on 1028  Progress:  442 on 1028  Progress:  443 on 1028  Progress:  444 on 1028  Progress:  445 on 1028  Progress:  446 on 1028  Progress:  447 on 1028  Progress:  448 on 1028  Progress:  449 on 1028  Progress:  450 on 1028  Progress:  451 on 1028  Progress:  452 on 1028  Progress:  453 on 1028  Progress:  454 on 1028  Progress:  455 on 1028  Progress:  456 on 1028  Progress:  457 on 1028  Progress:  458 on 1028  Progress:  459 on 1028  Progress:  460 on 1028  Progress:  461 on 1028  Progress:  462 on 1028  Progress:  463 on 1028  Progress:  464 on 1028  Progress:  465 on 1028  Progress:  466 on 1028  Progress:  467 on 1028  Progress:  468 on 1028  Progress:  469 on 1028  Progress:  470 on 1028  Progress:  471 on 1028  Progress:  472 on 1028  Progress:  473 on 1028  Progress:  474 on 1028  Progress:  475 on 1028  Progress:  476 on 1028  Progress:  477 on 1028  Progress:  478 on 1028  Progress:  479 on 1028  Progress:  480 on 1028  Progress:  481 on 1028  Progress:  482 on 1028  Progress:  483 on 1028  Progress:  484 on 1028  Progress:  485 on 1028  Progress:  486 on 1028  Progress:  487 on 1028  Progress:  488 on 1028  Progress:  489 on 1028  Progress:  490 on 1028  Progress:  491 on 1028  Progress:  492 on 1028  Progress:  493 on 1028  Progress:  494 on 1028  Progress:  495 on 1028  Progress:  496 on 1028  Progress:  497 on 1028  Progress:  498 on 1028  Progress:  499 on 1028  Progress:  500 on 1028  Progress:  501 on 1028  Progress:  502 on 1028  Progress:  503 on 1028  Progress:  504 on 1028  Progress:  505 on 1028  Progress:  506 on 1028  Progress:  507 on 1028  Progress:  508 on 1028  Progress:  509 on 1028  Progress:  510 on 1028  Progress:  511 on 1028  Progress:  512 on 1028  Progress:  513 on 1028  Progress:  514 on 1028  Progress:  515 on 1028  Progress:  516 on 1028  Progress:  517 on 1028  Progress:  518 on 1028  Progress:  519 on 1028  Progress:  520 on 1028  Progress:  521 on 1028  Progress:  522 on 1028  Progress:  523 on 1028  Progress:  524 on 1028  Progress:  525 on 1028  Progress:  526 on 1028  Progress:  527 on 1028  Progress:  528 on 1028  Progress:  529 on 1028  Progress:  530 on 1028  Progress:  531 on 1028  Progress:  532 on 1028  Progress:  533 on 1028  Progress:  534 on 1028  Progress:  535 on 1028  Progress:  536 on 1028  Progress:  537 on 1028  Progress:  538 on 1028  Progress:  539 on 1028  Progress:  540 on 1028  Progress:  541 on 1028  Progress:  542 on 1028  Progress:  543 on 1028  Progress:  544 on 1028  Progress:  545 on 1028  Progress:  546 on 1028  Progress:  547 on 1028  Progress:  548 on 1028  Progress:  549 on 1028  Progress:  550 on 1028  Progress:  551 on 1028  Progress:  552 on 1028  Progress:  553 on 1028  Progress:  554 on 1028  Progress:  555 on 1028  Progress:  556 on 1028  Progress:  557 on 1028  Progress:  558 on 1028  Progress:  559 on 1028  Progress:  560 on 1028  Progress:  561 on 1028  Progress:  562 on 1028  Progress:  563 on 1028  Progress:  564 on 1028  Progress:  565 on 1028  Progress:  566 on 1028  Progress:  567 on 1028  Progress:  568 on 1028  Progress:  569 on 1028  Progress:  570 on 1028  Progress:  571 on 1028  Progress:  572 on 1028  Progress:  573 on 1028  Progress:  574 on 1028  Progress:  575 on 1028  Progress:  576 on 1028  Progress:  577 on 1028  Progress:  578 on 1028  Progress:  579 on 1028  Progress:  580 on 1028  Progress:  581 on 1028  Progress:  582 on 1028  Progress:  583 on 1028  Progress:  584 on 1028  Progress:  585 on 1028  Progress:  586 on 1028  Progress:  587 on 1028  Progress:  588 on 1028  Progress:  589 on 1028  Progress:  590 on 1028  Progress:  591 on 1028  Progress:  592 on 1028  Progress:  593 on 1028  Progress:  594 on 1028  Progress:  595 on 1028  Progress:  596 on 1028  Progress:  597 on 1028  Progress:  598 on 1028  Progress:  599 on 1028  Progress:  600 on 1028  Progress:  601 on 1028  Progress:  602 on 1028  Progress:  603 on 1028  Progress:  604 on 1028  Progress:  605 on 1028  Progress:  606 on 1028  Progress:  607 on 1028  Progress:  608 on 1028  Progress:  609 on 1028  Progress:  610 on 1028  Progress:  611 on 1028  Progress:  612 on 1028  Progress:  613 on 1028  Progress:  614 on 1028  Progress:  615 on 1028  Progress:  616 on 1028  Progress:  617 on 1028  Progress:  618 on 1028  Progress:  619 on 1028  Progress:  620 on 1028  Progress:  621 on 1028  Progress:  622 on 1028  Progress:  623 on 1028  Progress:  624 on 1028  Progress:  625 on 1028  Progress:  626 on 1028  Progress:  627 on 1028  Progress:  628 on 1028  Progress:  629 on 1028  Progress:  630 on 1028  Progress:  631 on 1028  Progress:  632 on 1028  Progress:  633 on 1028  Progress:  634 on 1028  Progress:  635 on 1028  Progress:  636 on 1028  Progress:  637 on 1028  Progress:  638 on 1028  Progress:  639 on 1028  Progress:  640 on 1028  Progress:  641 on 1028  Progress:  642 on 1028  Progress:  643 on 1028  Progress:  644 on 1028  Progress:  645 on 1028  Progress:  646 on 1028  Progress:  647 on 1028  Progress:  648 on 1028  Progress:  649 on 1028  Progress:  650 on 1028  Progress:  651 on 1028  Progress:  652 on 1028  Progress:  653 on 1028  Progress:  654 on 1028  Progress:  655 on 1028  Progress:  656 on 1028  Progress:  657 on 1028  Progress:  658 on 1028  Progress:  659 on 1028  Progress:  660 on 1028  Progress:  661 on 1028  Progress:  662 on 1028  Progress:  663 on 1028  Progress:  664 on 1028  Progress:  665 on 1028  Progress:  666 on 1028  Progress:  667 on 1028  Progress:  668 on 1028  Progress:  669 on 1028  Progress:  670 on 1028  Progress:  671 on 1028  Progress:  672 on 1028  Progress:  673 on 1028  Progress:  674 on 1028  Progress:  675 on 1028  Progress:  676 on 1028  Progress:  677 on 1028  Progress:  678 on 1028  Progress:  679 on 1028  Progress:  680 on 1028  Progress:  681 on 1028  Progress:  682 on 1028  Progress:  683 on 1028  Progress:  684 on 1028  Progress:  685 on 1028  Progress:  686 on 1028  Progress:  687 on 1028  Progress:  688 on 1028  Progress:  689 on 1028  Progress:  690 on 1028  Progress:  691 on 1028  Progress:  692 on 1028  Progress:  693 on 1028  Progress:  694 on 1028  Progress:  695 on 1028  Progress:  696 on 1028  Progress:  697 on 1028  Progress:  698 on 1028  Progress:  699 on 1028  Progress:  700 on 1028  Progress:  701 on 1028  Progress:  702 on 1028  Progress:  703 on 1028  Progress:  704 on 1028  Progress:  705 on 1028  Progress:  706 on 1028  Progress:  707 on 1028  Progress:  708 on 1028  Progress:  709 on 1028  Progress:  710 on 1028  Progress:  711 on 1028  Progress:  712 on 1028  Progress:  713 on 1028  Progress:  714 on 1028  Progress:  715 on 1028  Progress:  716 on 1028  Progress:  717 on 1028  Progress:  718 on 1028  Progress:  719 on 1028  Progress:  720 on 1028  Progress:  721 on 1028  Progress:  722 on 1028  Progress:  723 on 1028  Progress:  724 on 1028  Progress:  725 on 1028  Progress:  726 on 1028  Progress:  727 on 1028  Progress:  728 on 1028  Progress:  729 on 1028  Progress:  730 on 1028  Progress:  731 on 1028  Progress:  732 on 1028  Progress:  733 on 1028  Progress:  734 on 1028  Progress:  735 on 1028  Progress:  736 on 1028  Progress:  737 on 1028  Progress:  738 on 1028  Progress:  739 on 1028  Progress:  740 on 1028  Progress:  741 on 1028  Progress:  742 on 1028  Progress:  743 on 1028  Progress:  744 on 1028  Progress:  745 on 1028  Progress:  746 on 1028  Progress:  747 on 1028  Progress:  748 on 1028  Progress:  749 on 1028  Progress:  750 on 1028  Progress:  751 on 1028  Progress:  752 on 1028  Progress:  753 on 1028  Progress:  754 on 1028  Progress:  755 on 1028  Progress:  756 on 1028  Progress:  757 on 1028  Progress:  758 on 1028  Progress:  759 on 1028  Progress:  760 on 1028  Progress:  761 on 1028  Progress:  762 on 1028  Progress:  763 on 1028  Progress:  764 on 1028  Progress:  765 on 1028  Progress:  766 on 1028  Progress:  767 on 1028  Progress:  768 on 1028  Progress:  769 on 1028  Progress:  770 on 1028  Progress:  771 on 1028  Progress:  772 on 1028  Progress:  773 on 1028  Progress:  774 on 1028  Progress:  775 on 1028  Progress:  776 on 1028  Progress:  777 on 1028  Progress:  778 on 1028  Progress:  779 on 1028  Progress:  780 on 1028  Progress:  781 on 1028  Progress:  782 on 1028  Progress:  783 on 1028  Progress:  784 on 1028  Progress:  785 on 1028  Progress:  786 on 1028  Progress:  787 on 1028  Progress:  788 on 1028  Progress:  789 on 1028  Progress:  790 on 1028  Progress:  791 on 1028  Progress:  792 on 1028  Progress:  793 on 1028  Progress:  794 on 1028  Progress:  795 on 1028  Progress:  796 on 1028  Progress:  797 on 1028  Progress:  798 on 1028  Progress:  799 on 1028  Progress:  800 on 1028  Progress:  801 on 1028  Progress:  802 on 1028  Progress:  803 on 1028  Progress:  804 on 1028  Progress:  805 on 1028  Progress:  806 on 1028  Progress:  807 on 1028  Progress:  808 on 1028  Progress:  809 on 1028  Progress:  810 on 1028  Progress:  811 on 1028  Progress:  812 on 1028  Progress:  813 on 1028  Progress:  814 on 1028  Progress:  815 on 1028  Progress:  816 on 1028  Progress:  817 on 1028  Progress:  818 on 1028  Progress:  819 on 1028  Progress:  820 on 1028  Progress:  821 on 1028  Progress:  822 on 1028  Progress:  823 on 1028  Progress:  824 on 1028  Progress:  825 on 1028  Progress:  826 on 1028  Progress:  827 on 1028  Progress:  828 on 1028  Progress:  829 on 1028  Progress:  830 on 1028  Progress:  831 on 1028  Progress:  832 on 1028  Progress:  833 on 1028  Progress:  834 on 1028  Progress:  835 on 1028  Progress:  836 on 1028  Progress:  837 on 1028  Progress:  838 on 1028  Progress:  839 on 1028  Progress:  840 on 1028  Progress:  841 on 1028  Progress:  842 on 1028  Progress:  843 on 1028  Progress:  844 on 1028  Progress:  845 on 1028  Progress:  846 on 1028  Progress:  847 on 1028  Progress:  848 on 1028  Progress:  849 on 1028  Progress:  850 on 1028  Progress:  851 on 1028  Progress:  852 on 1028  Progress:  853 on 1028  Progress:  854 on 1028  Progress:  855 on 1028  Progress:  856 on 1028  Progress:  857 on 1028  Progress:  858 on 1028  Progress:  859 on 1028  Progress:  860 on 1028  Progress:  861 on 1028  Progress:  862 on 1028  Progress:  863 on 1028  Progress:  864 on 1028  Progress:  865 on 1028  Progress:  866 on 1028  Progress:  867 on 1028  Progress:  868 on 1028  Progress:  869 on 1028  Progress:  870 on 1028  Progress:  871 on 1028  Progress:  872 on 1028  Progress:  873 on 1028  Progress:  874 on 1028  Progress:  875 on 1028  Progress:  876 on 1028  Progress:  877 on 1028  Progress:  878 on 1028  Progress:  879 on 1028  Progress:  880 on 1028  Progress:  881 on 1028  Progress:  882 on 1028  Progress:  883 on 1028  Progress:  884 on 1028  Progress:  885 on 1028  Progress:  886 on 1028  Progress:  887 on 1028  Progress:  888 on 1028  Progress:  889 on 1028  Progress:  890 on 1028  Progress:  891 on 1028  Progress:  892 on 1028  Progress:  893 on 1028  Progress:  894 on 1028  Progress:  895 on 1028  Progress:  896 on 1028  Progress:  897 on 1028  Progress:  898 on 1028  Progress:  899 on 1028  Progress:  900 on 1028  Progress:  901 on 1028  Progress:  902 on 1028  Progress:  903 on 1028  Progress:  904 on 1028  Progress:  905 on 1028  Progress:  906 on 1028  Progress:  907 on 1028  Progress:  908 on 1028  Progress:  909 on 1028  Progress:  910 on 1028  Progress:  911 on 1028  Progress:  912 on 1028  Progress:  913 on 1028  Progress:  914 on 1028  Progress:  915 on 1028  Progress:  916 on 1028  Progress:  917 on 1028  Progress:  918 on 1028  Progress:  919 on 1028  Progress:  920 on 1028  Progress:  921 on 1028  Progress:  922 on 1028  Progress:  923 on 1028  Progress:  924 on 1028  Progress:  925 on 1028  Progress:  926 on 1028  Progress:  927 on 1028  Progress:  928 on 1028  Progress:  929 on 1028  Progress:  930 on 1028  Progress:  931 on 1028  Progress:  932 on 1028  Progress:  933 on 1028  Progress:  934 on 1028  Progress:  935 on 1028  Progress:  936 on 1028  Progress:  937 on 1028  Progress:  938 on 1028  Progress:  939 on 1028  Progress:  940 on 1028  Progress:  941 on 1028  Progress:  942 on 1028  Progress:  943 on 1028  Progress:  944 on 1028  Progress:  945 on 1028  Progress:  946 on 1028  Progress:  947 on 1028  Progress:  948 on 1028  Progress:  949 on 1028  Progress:  950 on 1028  Progress:  951 on 1028  Progress:  952 on 1028  Progress:  953 on 1028  Progress:  954 on 1028  Progress:  955 on 1028  Progress:  956 on 1028  Progress:  957 on 1028  Progress:  958 on 1028  Progress:  959 on 1028  Progress:  960 on 1028  Progress:  961 on 1028  Progress:  962 on 1028  Progress:  963 on 1028  Progress:  964 on 1028  Progress:  965 on 1028  Progress:  966 on 1028  Progress:  967 on 1028  Progress:  968 on 1028  Progress:  969 on 1028  Progress:  970 on 1028  Progress:  971 on 1028  Progress:  972 on 1028  Progress:  973 on 1028  Progress:  974 on 1028  Progress:  975 on 1028  Progress:  976 on 1028  Progress:  977 on 1028  Progress:  978 on 1028  Progress:  979 on 1028  Progress:  980 on 1028  Progress:  981 on 1028  Progress:  982 on 1028  Progress:  983 on 1028  Progress:  984 on 1028  Progress:  985 on 1028  Progress:  986 on 1028  Progress:  987 on 1028  Progress:  988 on 1028  Progress:  989 on 1028  Progress:  990 on 1028  Progress:  991 on 1028  Progress:  992 on 1028  Progress:  993 on 1028  Progress:  994 on 1028  Progress:  995 on 1028  Progress:  996 on 1028  Progress:  997 on 1028  Progress:  998 on 1028  Progress:  999 on 1028  Progress: 1000 on 1028  Progress: 1001 on 1028  Progress: 1002 on 1028  Progress: 1003 on 1028  Progress: 1004 on 1028  Progress: 1005 on 1028  Progress: 1006 on 1028  Progress: 1007 on 1028  Progress: 1008 on 1028  Progress: 1009 on 1028  Progress: 1010 on 1028  Progress: 1011 on 1028  Progress: 1012 on 1028  Progress: 1013 on 1028  Progress: 1014 on 1028  Progress: 1015 on 1028  Progress: 1016 on 1028  Progress: 1017 on 1028  Progress: 1018 on 1028  Progress: 1019 on 1028  Progress: 1020 on 1028  Progress: 1021 on 1028  Progress: 1022 on 1028  Progress: 1023 on 1028  Progress: 1024 on 1028  Progress: 1025 on 1028  Progress: 1026 on 1028  Progress: 1027 on 1028  Progress: 1028 on 1028  
za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),as.character(miejsce_wydania)),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu)

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(!grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa|dotycz|pol",X500,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
  
#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,ZA_ADNOTACJE %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL")
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(noquote(kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700)",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700)",sep = "# ")),as.character(polaczone$za_adnotacje))
#korekta automatycznego IOK
automatyczny_IOK <- polaczone %>%
  mutate(czy_tyt_oryg = (!grepl("polsk",DZ_NAZWA)&!is.na(za_tytul_oryginalu))|grepl("polsk",DZ_NAZWA)) %>%
  filter(za_adnotacje==""&am_nazwisko!="NA"&!grepl("pseud|nazw",za_opis_fizyczny_ksiazki)&!grepl("\\|",am_nazwisko)&czy_tyt_oryg==TRUE) %>%
  select(rekord_BN) %>%
  unique() %>%
  filter(rekord_BN %notin% data$ZA_UWAGI[data$czy_automatycznie=="nie"]) %>%
  mutate(automatyczny_import = "tak")

write.csv2(automatyczny_IOK, "C:/Users/Cezary/Desktop/imp_2009_automatyczne_antologie.csv", row.names = F, na = '', fileEncoding = 'UTF-8')

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}
Progress:  1 on 16  Progress:  2 on 16  Progress:  3 on 16  Progress:  4 on 16  Progress:  5 on 16  Progress:  6 on 16  Progress:  7 on 16  Progress:  8 on 16  Progress:  9 on 16  Progress: 10 on 16  Progress: 11 on 16  Progress: 12 on 16  Progress: 13 on 16  Progress: 14 on 16  Progress: 15 on 16  Progress: 16 on 16  
out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

#przypisanie do automatycznego OK redaktora "automat"
out <- out %>%
  mutate(pracownik = ifelse(rekord_BN %in% automatyczny_IOK$rekord_BN,"AUTOMAT",as.character(pracownik))) %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))

x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/Cezary/Desktop/2009_antologie_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
Progress: 1 on 1  
test <- bn_ok %>%
  select(rodzaj_ksiazki) %>%
  unique()
Było 50 lub więcej ostrzeżeń (użyj 'warnings()' aby zobaczyć pierwsze 50)
#może nie ma sensu zapisywać tych plików wcześniej, tylko teraz je połaczyć?
#to muszą mieć inną nazwę
#a może zrobić pętlę z wczytaniem, że się pliki dodają? - fajne, ale to pierwsze bardziej praktyczne
#docelowo przygotowujemy plik od razu na dysk, ale na razie xlsx do wgrania na dysk
#po tym przygotować na dysku unikatowe linki


#bn_ok + numer zapisu pozyskany na podstawie wyszukania w bazie danych

#docelowo będziemy tworzyć listy pracowników od razu na dysku, na razie funkcja tworzenia jest ciągle rozwijana przez twórców pakietu, więc póki co zostaje xslx
kolejnosc <- c("pracownik","ZA_ZAPIS_ID","typ_ksiazki","link","link_1","rok","status","blad_w_imporcie_tytulu","X100","X245","X650","X655","X246","X250","X260","X300","X380","X490","X500","X501","X546","X600","X700","X041","X080")
test <- bn_ok %>%
  select(pracownik = redaktor_dzialu,typ_ksiazki = rodzaj_ksiazki,link = BN_URL, rok, X100, X245, X650, X655, X246, X250, X260, X300, X490, X500, X501, X546, X600, X700, X041, X080) %>%
  mutate(link_1 = paste("=HYPERLINK(\"",link,"\";\"link do książki w BN\")",sep = ""),
         blad_w_imporcie_tytulu = FALSE)

#tutaj wyszukanie bazy, które da id zapisu i status, potem merge i select%>%
  select(noquote(kolejnosc))

#ZA_ZAPIS_ID,status pobrane z bazy tuż po imporcie
#pracownik  ZA_ZAPIS_ID typ_ksiazki link    link    rok status  blad_w_imporcie_tytulu  X100    X245    X650    X655    X246    X250    X260    X300    X380    X490    X500    X501    X546    X600    X700    X041    X080
data <- harlequiny
data$X245 <- str_replace_all(data$X245, "\\]\\. ", "]|$a")
data$X245 <- str_replace_all(data$X245, "\\/[^\\$]", "/$c")
data <- cSplit(data, c("X245", "X246"), sep = "|", direction = "long")
data <- data.frame(data, licznik = 1:length(data$id))

#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1
za_uwagi <- data %>%
  select(za_uwagi = id, licznik)
za_uwagi$za_uwagi <- str_replace_all(za_uwagi$za_uwagi," ","0")
za_uwagi$za_uwagi <- ifelse(nchar(za_uwagi$za_uwagi)==13,za_uwagi$za_uwagi, sprintf("%013d", as.integer(za_uwagi$za_uwagi)))

za_uwagi %$%  
    { za_uwagi == dplyr::lag(za_uwagi, 1)} %>% 
    as.numeric() %>% 
    {.} -> za_uwagi$same
za_uwagi$same[1] <- 0
za_uwagi$za_uwagi <- ifelse(za_uwagi$same==1,paste(za_uwagi$za_uwagi,"_2", sep = ""),za_uwagi$za_uwagi)

za_uwagi <- za_uwagi %>%
  select(1,2)
#2
rz_nazwa <- data.frame(rz_nazwa = rep("książka twórcy (podmiotowa)", length(1:length(za_uwagi$za_uwagi))))
rz_nazwa <- data.frame(rz_nazwa = rz_nazwa$rz_nazwa, licznik = 1:lengths(rz_nazwa))
#3
za_ro_rok <- data %>%
  select(za_ro_rok = rok, licznik)
#4
za_type <- data.frame(licznik = data$licznik, za_type = "KS")
#5
rz_rodzaj_id <- merge(x = rz_nazwa, y = PBL_rodzaje_zapisow, by.x = 'rz_nazwa', by.y = 'RZ_NAZWA', sort = FALSE,all.x = TRUE)
rz_rodzaj_id <- rz_rodzaj_id[order(rz_rodzaj_id$licznik),]
rz_rodzaj_id <- rz_rodzaj_id %>%
  select(RZ_RODZAJ_ID, licznik)
#6
BN_autor <- data.frame(autorzy = as.character(str_extract_all(data$X245, "(?<=\\/\\$c)(.*)(?= ;)")), licznik = data$licznik)
BN_autor <- mutate(BN_autor,
                   nazwa = str_replace_all(str_to_lower(BN_autor$autorzy), "\\W", ""))

nazwa2 <- ifelse(is.na(PBL_autorzy$AM_IMIE),as.character(PBL_autorzy$AM_NAZWISKO),paste(PBL_autorzy$AM_IMIE,PBL_autorzy$AM_NAZWISKO, sep = ""))
nazwa2 <- data.frame(nazwa2 = str_to_lower(str_replace_all(nazwa2, "\\W", "")))
nazwa2 <- data.frame(nazwa2 = str_replace_all(str_to_lower(nazwa2$nazwa2), "\\W", ""))
PBL_autorzy <- data.frame(PBL_autorzy, nazwa2 = nazwa2$nazwa2)
PBL_autorzy <- PBL_autorzy %>%
  filter(nazwa2 != "nana")

BN_PBL_autor <- merge(x = BN_autor, y = PBL_autorzy, by.x = 'nazwa', by.y = 'nazwa2', sort = FALSE, all.x = TRUE)
BN_PBL_autor <- BN_PBL_autor[order(BN_PBL_autor$licznik, BN_PBL_autor$AM_AUTOR_ID),]

BN_PBL_autor <- BN_PBL_autor[order(BN_PBL_autor$licznik, -BN_PBL_autor$AM_LICZBA_ZAPISOW),]

BN_PBL_autor %$%  
    { licznik == dplyr::lag(licznik, 1) } %>% 
    as.numeric() %>% 
    {.} -> BN_PBL_autor$same
BN_PBL_autor$same[1] <- 0

BN_PBL_autor <- BN_PBL_autor %>%
  filter(same==0) %>%
  select(1:14)
colnames(BN_PBL_autor)[14] <- "nazwa_naz_im"
BN_autor_podzielony <- data.frame(autor = str_replace_all(BN_autor$autorzy, "( (?!.* ))","|"), licznik = BN_autor$licznik)
BN_autor_podzielony <- cSplit(BN_autor_podzielony, c("autor"), sep = "|", direction = "wide")
BN_PBL_autor <- merge(BN_PBL_autor,BN_autor_podzielony,by = "licznik", all = TRUE)

am_autor_id <- BN_PBL_autor %>%
  select(licznik, AM_AUTOR_ID)
#7
am_nazwisko <- data.frame(nazwisko = BN_autor_podzielony$autor_2, licznik = BN_autor_podzielony$licznik)
aut_id_nazw <- merge(x = am_nazwisko, y = am_autor_id, by = "licznik", all.x=TRUE)
am_nazwisko <- data.frame(am_nazwisko = ifelse(is.na(aut_id_nazw$AM_AUTOR_ID),as.character(aut_id_nazw$nazwisko), NA), licznik = aut_id_nazw$licznik)
#8
am_imie <- data.frame(imie = BN_autor_podzielony$autor_1, licznik = BN_autor_podzielony$licznik)
aut_id_imie <- merge(x = am_imie, y = am_autor_id, by = "licznik", all.x=TRUE)
am_imie <- data.frame(am_imie = ifelse(is.na(aut_id_imie$AM_AUTOR_ID),as.character(aut_id_imie$imie), NA), licznik = aut_id_nazw$licznik)
#9
tw_tworca_id <- merge(x = BN_PBL_autor, y = PBL_autor_to_tworca, by.x = 'AM_AUTOR_ID', by.y = 'id autora', sort = FALSE, all.x = TRUE)
tw_tworca_id <- merge(x = tw_tworca_id, y = PBL_tworcy, by.x = 'id tworcy', by.y = 'TW_TWORCA_ID', sort = FALSE, all.x = TRUE)
tw_tworca_id <- tw_tworca_id %>%
  select(licznik,`id tworcy`,AM_NAZWISKO=autor_2,AM_IMIE=autor_1, DZ_NAZWA, TW_DZ_DZIAL_ID)
tw_tworca_id$`id tworcy`[tw_tworca_id$TW_DZ_DZIAL_ID==430] <- NA
tw_tworca_id$AM_NAZWISKO[tw_tworca_id$TW_DZ_DZIAL_ID==430] <- NA
tw_tworca_id$AM_IMIE[tw_tworca_id$TW_DZ_DZIAL_ID==430] <- NA
BN_PBL_tworca <- tw_tworca_id %>%
    select(1,TW_TWORCA_ID = 2,TW_NAZWISKO = 3,TW_IMIE = 4,DZ_NAZWA,TW_DZ_DZIAL_ID)

tw_tworca_id <- tw_tworca_id %>%
  select(1,TW_TWORCA_ID = 2,TW_NAZWISKO = 3,TW_IMIE = 4)

tw_tworca_id <- tw_tworca_id[order(tw_tworca_id$licznik,tw_tworca_id$TW_TWORCA_ID,tw_tworca_id$TW_NAZWISKO,tw_tworca_id$TW_IMIE),]
tw_tworca_id <- tw_tworca_id %>%
  unique()
tw_tworca_id %$%  
    { licznik == dplyr::lag(licznik, 1) } %>% 
    as.numeric() %>% 
    {.} -> tw_tworca_id$same
tw_tworca_id$same[1] <- 0
tw_tworca_id <- tw_tworca_id %>%
  filter(same==0) %>%
  select(-length(tw_tworca_id))
#10
tw_nazwisko <- tw_tworca_id
tw_nazwisko$TW_NAZWISKO[!is.na(tw_nazwisko$TW_TWORCA_ID)] <- NA
tw_nazwisko <- tw_nazwisko %>%
  select(licznik,TW_NAZWISKO)
#11
tw_imie <- tw_tworca_id
tw_imie$TW_IMIE[!is.na(tw_imie$TW_TWORCA_ID)] <- NA
tw_imie <- tw_imie %>%
  select(licznik,TW_IMIE)
#12
BN_PBL_tworca <- BN_PBL_tworca[order(BN_PBL_tworca$licznik,BN_PBL_tworca$TW_TWORCA_ID,BN_PBL_tworca$TW_NAZWISKO,BN_PBL_tworca$TW_IMIE),]
BN_PBL_tworca <- BN_PBL_tworca %>%
  unique()
BN_PBL_tworca %$%  
    { licznik == dplyr::lag(licznik, 1) } %>% 
    as.numeric() %>% 
    {.} -> BN_PBL_tworca$same
BN_PBL_tworca$same[1] <- 0
BN_PBL_tworca <- BN_PBL_tworca %>%
  filter(same==0) %>%
  select(-length(BN_PBL_tworca))

dz_nazwa_full <- BN_PBL_tworca
dz_nazwa_full <- dz_nazwa_full[order(dz_nazwa_full$licznik),]

#dział na podstawie literatury
literatura_BN <- BN_PBL_tworca %>%
    select(licznik,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE)

marc_field_655 <- data %>%
  select(licznik,X655)%>%
  filter(X655!="")
marc_field_655$X655<-str_replace_all(marc_field_655$X655,"(^|\\|)","~\\1")
marc_field_655<- cSplit(marc_field_655,"X655",sep = "~",direction = "long")
marc_field_655<- marc_field_655%>%
  filter(X655!="")
marc_field_655$X655<-str_remove_all(marc_field_655$X655,"^\\|")
marc_field_655 <- mutate(marc_field_655,
               indicator = str_replace_all(marc_field_655$X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list

marc_field_655<-cbind(marc_field_655,empty_table)

subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)

for (i in x) {
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
  progress(match(i,x), max.value = length(x)) 
}
for (i in x) {
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
string_a <- "(^)(.*?\\|"
string_b <- subfield_list_char2[i]
string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
string <- paste(string_a,string_b,string_c,sep = "")
marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

literatura_BN <- merge(x = literatura_BN, y = marc_field_655, by.x = "licznik",all.x = TRUE)
literatura_BN <- literatura_BN %>%
  select(1,2,3,4,X655 = 7)

tw_do_ustalenia <- literatura_BN %>%
  filter(is.na(TW_TWORCA_ID))

dz_osob_bez_teatr <- PBL_dz_osob_bez_teatru %>%
  select(1,2) %>%
  unique()

dz_osob_bez_teatr <- mutate(dz_osob_bez_teatr,
                              nazwa = substr(str_replace(dz_osob_bez_teatr$DZ_NAZWA, "(.*?\\()(.*?)(\\).*$)","\\2"),1,nchar(str_replace(dz_osob_bez_teatr$DZ_NAZWA, "(.*?\\()(.*?)(\\).*$)","\\2"))-1))

reczne <- data.frame(DZ_DZIAL_ID = c(697,697,697,697,825,1037,1187,1454,884,902,544,544,544,544),DZ_NAZWA = c("Hasła osobowe (brytyjska i irlandzka)","Hasła osobowe (brytyjska i irlandzka)","Hasła osobowe (brytyjska i irlandzka)","Hasła osobowe (brytyjska i irlandzka)","Hasła osobowe (grecka starożytna)","Hasła osobowe (łacińska starożytna)","Hasła osobowe (syryjska)","Hasła osobowe (esperanto)","Hasła osobowe (holenderska)","Hasła osobowe (Indii)","Hasła osobowe (Afryki Subsaharyjskiej)","Hasła osobowe (Afryki Subsaharyjskiej)","Hasła osobowe (Afryki Subsaharyjskiej)","Hasła osobowe (Afryki Subsaharyjskiej)"), redaktor_dzialu = c("BEATAK","BEATAK","BEATAK","BEATAK","BEATAS","BEATAS","BEATAD","CEZARY","TOMASZU","EWA","EWA","EWA","EWA","EWA"), nazwa = c("angielsk","szkock","irlandzk","walijsk","greck","łacińsk","syryjsk","esperanck","niderlandzk","indyjsk","południowoafryka","senegalsk","nigeryjsk","afrykańsk"))
reczne <- reczne %>%
  select(1,2,4)
dz_osob_bez_teatr <- rbind(dz_osob_bez_teatr,reczne)
dz_osob_bez_teatr$nazwa[dz_osob_bez_teatr$nazwa=="literatura polsk"] <- "polsk"

literatura_dz <- sqldf("select *
                            from tw_do_ustalenia a
                            left join dz_osob_bez_teatr b on a.X655 like ('%'||b.nazwa||'%')")

literatura_dz <- literatura_dz[order(literatura_dz$licznik,literatura_dz$TW_NAZWISKO,literatura_dz$TW_IMIE,literatura_dz$DZ_DZIAL_ID),]
literatura_dz %$%  
    { licznik == dplyr::lag(licznik, 1) } %>% 
    as.numeric() %>% 
    {.} -> literatura_dz$same
literatura_dz$same[1] <- 0
literatura_dz <- literatura_dz %>%
  filter(same==0) %>%
  select(-length(literatura_dz))
test <- mutate(BN_PBL_tworca,
               polaczone = paste(BN_PBL_tworca$TW_TWORCA_ID,BN_PBL_tworca$licznik,BN_PBL_tworca$TW_NAZWISKO,BN_PBL_tworca$TW_IMIE,sep = "|"))
literatura_dz <- mutate(literatura_dz,
                        polaczone = paste(literatura_dz$TW_TWORCA_ID,literatura_dz$licznik,literatura_dz$TW_NAZWISKO,literatura_dz$TW_IMIE,sep = "|"))

test <- sqldf("select *
                            from test a
                            left join literatura_dz b on a.polaczone=b.polaczone")

test$TW_DZ_DZIAL_ID <- ifelse(is.na(test$TW_TWORCA_ID), test$DZ_DZIAL_ID,test$TW_DZ_DZIAL_ID)
test$DZ_NAZWA <- ifelse(is.na(test$TW_TWORCA_ID), test$DZ_NAZWA..14, test$DZ_NAZWA)
BN_PBL_tworca_full <- test %>%
  filter(!is.na(TW_DZ_DZIAL_ID)) %>%
  select(1:16)
test <- test %>%
  filter(is.na(TW_DZ_DZIAL_ID)) %>%
  select(1:16)

dz_nazwa_full <- BN_PBL_tworca_full %>%
  select(TW_TWORCA_ID,licznik,DZ_NAZWA, TW_DZ_DZIAL_ID, tw_imie=TW_IMIE, tw_nazwisko=TW_NAZWISKO)
dz_nazwa_full <- dz_nazwa_full[order(dz_nazwa_full$licznik),]

dz_nazwa <- dz_nazwa_full %>%
  select(licznik, DZ_NAZWA)
#13
dz_dzial_id <- dz_nazwa_full %>%
  select(licznik, DZ_DZIAL_ID=TW_DZ_DZIAL_ID)
#14
marc_field <- data %>%
  select(licznik,X245)#%>%
marc_field$X245<-str_remove_all(marc_field$X245,"^\\|")
marc_field <- mutate(marc_field,
               indicator = str_replace_all(marc_field$X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field)[1]))
colnames(empty_table) <-subfield_list

marc_field<-cbind(marc_field,empty_table)

subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)

for (i in x) {
  marc_field$X245 <- str_replace(marc_field$X245,subfield_list_char[i],"|\\1")
  progress(match(i,x), max.value = length(x)) 
}
for (i in x) {
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
string_a <- "(^)(.*?\\|"
string_b <- subfield_list_char2[i]
string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
string <- paste(string_a,string_b,string_c,sep = "")
marc_field[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field$X245),str_replace_all(gsub(string,"\\3",marc_field$X245),"\\${2}.", "~"),NA)
progress(match(i,x), max.value = length(x))  
}
marc_field$`$a`[is.na(marc_field$`$a`)] <- ""
za_tytul <- data.frame(tytul_bn = paste(marc_field$`$a`,marc_field$`$b`,sep = ""), licznik = marc_field$licznik)
za_tytul$tytul_bn <- str_remove(za_tytul$tytul_bn, "\\s+\\/$")
za_tytul <- mutate(za_tytul,
                   tytul = gsub("([a-zęóąśłżźćń])( )(:)( {0,1})(\\({0,1})([a-zęóąśłżźćńA-ZĘÓĄŚŁŻŹĆŃ])(.)","\\1.\\2\\U\\5\\6\\E\\7",perl = TRUE, za_tytul$tytul_bn))
za_tytul$tytul <- gsub("( )(:)( {0,1}[a-z])(.)","\\1\\U\\3\\E\\4",perl = TRUE, za_tytul$tytul)
za_tytul$tytul <- str_replace(za_tytul$tytul, "([^\\.])(\\.$)","\\1")
za_tytul <- za_tytul %>%
  select(2,3)
za_tytul_copy <- za_tytul

lista_gat_pbl <- data.frame(gatunek = c("aforyzm","album","antologia","autobiografia","dziennik","esej","felieton","inne","kazanie","list","miniatura prozą","opowiadanie","poemat","powieść","proza","proza poetycka","reportaż","rozmyślanie religijne","rysunek, obraz","scenariusz","szkic","tekst biblijny","tekst dramatyczny","wiersz","wspomnienie","wypowiedź"))

test <- data %>%
  select(licznik,X655,X650)
test2 <- sqldf("select *
              from test
              left join lista_gat_pbl on lower(test.X650) like '%'||lista_gat_pbl.gatunek||'%'")
test <- sqldf("select *
              from test
              left join lista_gat_pbl on lower(test.X655) like '%'||lista_gat_pbl.gatunek||'%'")
test <- test %>%
  select(licznik,gatunek)
test2 <- test2 %>%
  select(licznik,gatunek)
test <- rbind(test,test2)
test <- test %>%
  unique()
  
test <- test[order(test$licznik,test$gatunek),]
test %$%  
    { licznik == dplyr::lag(licznik, 1) } %>% 
    as.numeric() %>% 
    {.} -> test$same
test$same[1] <- 0
test <- test %>%
  filter(same==0) %>%
  select(-length(test))

za_tytul <- merge(x=za_tytul,y=test, by = "licznik", all.x = TRUE)
za_tytul$tytul <- ifelse(!is.na(za_tytul$gatunek),paste(za_tytul$tytul,". [",gsub("(^.)","\\U\\1",perl = TRUE, za_tytul$gatunek),"]",sep = ""),za_tytul$tytul)
#15
marc_field <- data %>%
  select(licznik,X246)
marc_field$X246 <- str_replace_all(marc_field$X246,"(^|\\|)","~\\1")
marc_field <- cSplit(marc_field,"X246",sep = "~",direction = "long")
marc_field$X246<-str_remove_all(marc_field$X246,"^\\|")
marc_field <- mutate(marc_field,
               indicator = str_replace_all(marc_field$X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field)[1]))
colnames(empty_table) <-subfield_list

marc_field<-cbind(marc_field,empty_table)

subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)

for (i in x) {
  marc_field$X246 <- str_replace(marc_field$X246,subfield_list_char[i],"|\\1")
  progress(match(i,x), max.value = length(x)) 
}
for (i in x) {
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
string_a <- "(^)(.*?\\|"
string_b <- subfield_list_char2[i]
string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
string <- paste(string_a,string_b,string_c,sep = "")
marc_field[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field$X246),str_replace_all(gsub(string,"\\3",marc_field$X246),"\\${2}.", "~"),NA)
progress(match(i,x), max.value = length(x))  
}
colnames(marc_field)[7] <- "inna"
marc_field$`$a`[is.na(marc_field$`$a`)] <- ""
marc_field$`$b`[is.na(marc_field$`$b`)] <- ""
za_tytul_oryginalu <- marc_field %>%
  select(licznik,`$a`,`$b`,`$i`)
za_tytul_oryginalu <- mutate(za_tytul_oryginalu,
                             tytul = ifelse(grepl("yt\\.{0,1} oryg|yt\\.{0,1}oryg|yt\\.{0,1} org|ytu[lł] orygina",za_tytul_oryginalu$`$i`),paste(za_tytul_oryginalu$`$a`,za_tytul_oryginalu$`$b`,sep = ""),NA))

za_tytul_oryginalu <- za_tytul_oryginalu[order(za_tytul_oryginalu$licznik,za_tytul_oryginalu$tytul),]
za_tytul_oryginalu %$%  
    { licznik == dplyr::lag(licznik, 1) } %>% 
    as.numeric() %>% 
    {.} -> za_tytul_oryginalu$same
za_tytul_oryginalu$same[1] <- 0
za_tytul_oryginalu <- za_tytul_oryginalu %>%
  filter(same==0) %>%
  select(-length(za_tytul_oryginalu))
za_tytul_oryginalu <- za_tytul_oryginalu %>%
  select(1,5)

za_tytul_oryginalu$tytul <- gsub("([a-zęóąśłżźćń])( )(:)( {0,1})(\\({0,1})([a-zęóąśłżźćńA-ZĘÓĄŚŁŻŹĆŃ])(.)","\\1.\\2\\U\\5\\6\\E\\7",perl = TRUE, za_tytul_oryginalu$tytul)
za_tytul_oryginalu$tytul <- gsub("( )(:)( {0,1}[a-z])(.)","\\1\\U\\3\\E\\4",perl = TRUE, za_tytul_oryginalu$tytul)
za_tytul_oryginalu$tytul <- str_replace(za_tytul_oryginalu$tytul, "([^\\.])(\\.$)","\\1")
#16
marc_field <- data %>%
  select(licznik,X041)
marc_field$X041<-str_remove_all(marc_field$X041,"^\\|")
marc_field <- mutate(marc_field,
               indicator = str_replace_all(marc_field$X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field)[1]))
colnames(empty_table) <-subfield_list

marc_field<-cbind(marc_field,empty_table)

subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)

for (i in x) {
  marc_field$X041 <- str_replace(marc_field$X041,subfield_list_char[i],"|\\1")
  progress(match(i,x), max.value = length(x)) 
}
for (i in x) {
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
string_a <- "(^)(.*?\\|"
string_b <- subfield_list_char2[i]
string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
string <- paste(string_a,string_b,string_c,sep = "")
marc_field[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field$X041),str_replace_all(gsub(string,"\\3",marc_field$X041),"\\${2}.", "~"),NA)
progress(match(i,x), max.value = length(x))  
}
za_jezyk_oryginalu <- marc_field %>%
  select(licznik,jezyk_oryginalu = `$a`)
za_jezyk_oryginalu$jezyk_oryginalu <- str_replace_all(za_jezyk_oryginalu$jezyk_oryginalu,"\\$a","|")
#17
BN_wspoltworca <- data.frame(wspoltworca = str_remove_all(as.character(str_extract_all(data$X245,"(?<=; )(.*)(?=$)")),"\\.$"), licznik = data$licznik)
BN_wspoltworca$wspoltworca <- str_remove_all(BN_wspoltworca$wspoltworca," et al\\.")
BN_wspoltworca <- mutate(BN_wspoltworca,
                         funkcja = as.character(str_extract_all(BN_wspoltworca$wspoltworca,"(?<=\\[)(.*?)(?= [A-ZÓŚŁŻŹĆŃ])")),
                         os_imie = as.character(str_extract_all(BN_wspoltworca$wspoltworca,"(?<= )(.*)(?= (?!.* ))")),
                         os_nazwisko = str_replace_all(BN_wspoltworca$wspoltworca,"(.*)( (?!.* ))(.*)(\\])", "\\3"))

ws_prosty <- paste(BN_wspoltworca$os_nazwisko,BN_wspoltworca$os_imie)
ws_prosty <- unlist(ws_prosty)
ws_prosty <- str_to_lower(ws_prosty)
ws_prosty <- str_replace_all(ws_prosty, "\\W", "")
ws_prosty <- list(ws_prosty)
ws_prosty <- data.frame(ws_prosty)
colnames(ws_prosty) <- "nazwa"

fu_prosta <- BN_wspoltworca$funkcja
fu_prosta <- unlist(fu_prosta)
fu_prosta <- str_to_lower(fu_prosta)
fu_prosta <- str_replace_all(fu_prosta, "\\W", "")
fu_prosta <- list(fu_prosta)
fu_prosta <- data.frame(fu_prosta)
colnames(fu_prosta) <- "nazwa"

ws_BN <- data.frame(licznik = BN_wspoltworca$licznik, os_nazwisko = BN_wspoltworca$os_nazwisko, os_imie = BN_wspoltworca$os_imie, nazwa_prosta = ws_prosty$nazwa, funkcja = BN_wspoltworca$funkcja, nazwa = fu_prosta$nazwa)

BN_PBL_wspoltworcy <- merge(x = ws_BN, y = PBL_wspoltworcy, by = 'nazwa_prosta', sort = FALSE, all.x = TRUE)

BN_PBL_wspoltworcy <- merge(x = BN_PBL_wspoltworcy, y = PBL_funkcje, by = 'nazwa', sort = FALSE, all.x = TRUE)

BN_PBL_wspoltworcy <- BN_PBL_wspoltworcy[order(as.integer(as.character(BN_PBL_wspoltworcy$licznik))),]

#nazwisko

b_os_nazwisko <- data.frame(os_nazwisko = ifelse(is.na(BN_PBL_wspoltworcy$OS_OSOBA_ID), as.character(BN_PBL_wspoltworcy$os_nazwisko), NA))
b_os_imie <- data.frame(os_imie = ifelse(is.na(BN_PBL_wspoltworcy$OS_OSOBA_ID), as.character(BN_PBL_wspoltworcy$os_imie), NA))

BN_PBL_osoby_funkcje <- data.frame(licznik = BN_PBL_wspoltworcy$licznik, os_osoba_id = BN_PBL_wspoltworcy$OS_OSOBA_ID, b_os_nazwisko, b_os_imie, fo_symbol = BN_PBL_wspoltworcy$fo_symbol, fo_nazwa = BN_PBL_wspoltworcy$fo_nazwa )

#22
za_opis_wspoltworcow <- data.frame(za_opis_wspoltworcow = gsub("(\\[)(.)(.*)", "\\1\\U\\2\\E\\3", perl = TRUE, BN_wspoltworca$wspoltworca), licznik = data$licznik)

#23
za_wydanie <- data.frame(data$X250)
za_wydanie <- data.frame(str_replace_all(za_wydanie[,1], "\\$aWyd\\. ",""))
za_wydanie <- data.frame(str_replace_all(za_wydanie[,1], ".\\$.*",""))
za_wydanie <- data.frame(str_replace_all(za_wydanie[,1], "(\\d)(\\.$)","\\1"))
za_wydanie <- cbind(za_wydanie, 1:lengths(za_wydanie))
colnames(za_wydanie) <- c("za_wydanie", "licznik")
#24
marc_field <- data %>%
  select(licznik,X245)
marc_field$X245<-str_replace_all(marc_field$X245,"(^|\\|)","~\\1")
marc_field<- cSplit(marc_field,"X245",sep = "~",direction = "long")
marc_field<- marc_field%>%
  filter(X245!="")
marc_field$X245<-str_remove_all(marc_field$X245,"^\\|")
marc_field <- mutate(marc_field,
               indicator = str_replace_all(marc_field$X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field)[1]))
colnames(empty_table) <-subfield_list

marc_field<-cbind(marc_field,empty_table)

subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)

for (i in x) {
  marc_field$X245 <- str_replace(marc_field$X245,subfield_list_char[i],"|\\1")
  progress(match(i,x), max.value = length(x)) 
}
for (i in x) {
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
string_a <- "(^)(.*?\\|"
string_b <- subfield_list_char2[i]
string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
string <- paste(string_a,string_b,string_c,sep = "")
marc_field[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field$X245),str_replace_all(gsub(string,"\\3",marc_field$X245),"\\${2}.", "~"),NA)
progress(match(i,x), max.value = length(x))  
}

za_instytucja <- marc_field %>%
  select(licznik, X245 = `$c`)

za_instytucja <- za_instytucja[order(za_instytucja$licznik,za_instytucja$X245),]
za_instytucja %$%  
    { licznik == dplyr::lag(licznik, 1) } %>% 
    as.numeric() %>% 
    {.} -> za_instytucja$same
za_instytucja$same[1] <- 0
za_instytucja <- za_instytucja %>%
  filter(same==0) %>%
  select(-length(za_instytucja))

za_instytucja <- mutate(za_instytucja,
                        instytucja = ifelse(grepl("\\;",za_instytucja$X245),str_replace_all(za_instytucja$X245, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),""))

za_instytucja <- merge(x=za_instytucja,y=BN_PBL_wspoltworcy,by = "licznik",all.x = TRUE)
za_instytucja <- za_instytucja %>%
  select(1,2,3,6,7)
za_instytucja <- mutate(za_instytucja,
                        czy_naz = str_detect(za_instytucja$X245,as.character(za_instytucja$os_nazwisko)),
                        czy_im = str_detect(za_instytucja$X245,as.character(za_instytucja$os_imie)))
test <- za_instytucja %>%
  filter(is.na(czy_naz)&is.na(czy_im)) %>%
  filter(instytucja!="") %>%
  filter(!(grepl("^\\[[a-zęóąśłżźćń]|^[a-zęóąśłżźćń]",instytucja))) %>%
  select(licznik,instytucja)
test$instytucja <- str_remove(test$instytucja,"(?<=[a-zęóąśłżźćń])(\\.$)")
za_instytucja <- test
test <- data %>%
  select(licznik)
za_instytucja <- merge(x=za_instytucja,y=test,by = "licznik", all = TRUE)
#25
BN_wydawnictwo <- data.frame(X260 = data$X260, licznik = data$licznik)
BN_wydawnictwo$X260 <- str_replace_all(BN_wydawnictwo$X260,"s\\.n\\.", "b.w.")
BN_wydawnictwo$X260 <- str_replace_all(BN_wydawnictwo$X260,"s\\.l\\.", "b.m.")
BN_wydawnictwo$X260 <- str_replace_all(BN_wydawnictwo$X260,"S\\.l\\.", "b.m.")
BN_wydawnictwo$X260 <- str_replace_all(BN_wydawnictwo$X260,"\\$f", "$c")
BN_wydawnictwo$X260 <- str_remove(BN_wydawnictwo$X260,"^\\\\+")
#ręcznie wygenerować i naprawić błąd ":$a" - powinno być albo ;$a, albo :$b
test <- mutate(BN_wydawnictwo,
               dwuk = str_detect(BN_wydawnictwo$X260,"\\:\\$a"))
test <- test %>%
  filter(dwuk==TRUE)
#BN_wydawnictwo$X260[BN_wydawnictwo$X260=="$aKraków :$bCollegium Columbinum ;$aWarszawa :$aTowarzystwo Badań nad Wiekiem Osiemnastym,$ccop. 2006."] <- "$aKraków :$bCollegium Columbinum ;$aWarszawa :$bTowarzystwo Badań nad Wiekiem Osiemnastym,$ccop. 2006."

BN_wydawnictwo <- mutate(BN_wydawnictwo,
                      rok_wydania = str_extract_all(BN_wydawnictwo$X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"),
                      bez_roku = str_replace_all(BN_wydawnictwo$X260, ".\\$c.*", ""))

BN_wydawnictwo$bez_roku <- str_replace_all(BN_wydawnictwo$bez_roku, ";\\$b", ":$b")
BN_wydawnictwo <- mutate(BN_wydawnictwo,
                      ile_wydawnictw = str_count(BN_wydawnictwo$bez_roku, "\\$b"),
                      ile_miejsc = str_count(BN_wydawnictwo$bez_roku, "\\$a"),
                      kolejnosc = str_remove(str_replace_all(as.character(str_extract_all(BN_wydawnictwo$bez_roku, "\\$.")), "[^a-z]", ""),"^c"),
                      podzielone = str_replace_all(BN_wydawnictwo$bez_roku,"(\\$.)","|\\1~"))

BN_wydawnictwo$podzielone <- str_remove(BN_wydawnictwo$podzielone,"^\\|")
BN_wydawnictwo$kolejnosc <- str_replace_all(BN_wydawnictwo$kolejnosc,"(.)","\\1|")
BN_wydawnictwo$kolejnosc <- str_remove(BN_wydawnictwo$kolejnosc,"\\|$")
BN_wydawnictwo <- cSplit(BN_wydawnictwo,c("kolejnosc","podzielone"), sep = "|", direction = "long")

BN_wydawnictwo %$%  
    { licznik == dplyr::lag(licznik, 1) & kolejnosc == dplyr::lag(kolejnosc, 1) } %>% 
    as.numeric() %>% 
    {.} -> BN_wydawnictwo$same
BN_wydawnictwo$same[1] <- 0
BN_wydawnictwo$rok_wydania <- as.character(BN_wydawnictwo$rok_wydania)
BN_wydawnictwo$lp <- 1:lengths(BN_wydawnictwo)
pierwsze <- BN_wydawnictwo %>%
  filter(same==0)
drugie <- BN_wydawnictwo %>%
  filter(same==1)
drugie <- ddply(drugie, .(X260, licznik, rok_wydania, bez_roku, ile_wydawnictw, ile_miejsc, kolejnosc, same), summarize, podzielone = paste(podzielone, collapse=""), lp = paste(lp, collapse="|"))
BN_wydawnictwo <- rbind(pierwsze,drugie)
BN_wydawnictwo$lp <- str_replace(BN_wydawnictwo$lp,"(.*?)(\\|)(.*$)","\\1")
BN_wydawnictwo$lp <- as.integer(BN_wydawnictwo$lp)
BN_wydawnictwo <- BN_wydawnictwo[order(BN_wydawnictwo$licznik,BN_wydawnictwo$lp),]
BN_wydawnictwo <- BN_wydawnictwo %>%
  select(-lp)
BN_wydawnictwo %$%  
    { licznik == dplyr::lag(licznik, 1) & kolejnosc == "b" & kolejnosc == dplyr::lead(kolejnosc, 1) } %>% 
    as.numeric() %>% 
    {.} -> BN_wydawnictwo$same2
BN_wydawnictwo$same2[length(BN_wydawnictwo$podzielone)] <- 0

BN_wydawnictwo$podzielone2 <- lag(BN_wydawnictwo$podzielone,n=1)
BN_wydawnictwo %$%  
    { licznik == dplyr::lag(licznik, 1) & kolejnosc == "a" & kolejnosc == dplyr::lag(kolejnosc, 1) } %>% 
    as.numeric() %>% 
    {.} -> BN_wydawnictwo$same_a
BN_wydawnictwo$same_a[1] <- 0

BN_wydawnictwo$podzielone3 <- lead(BN_wydawnictwo$podzielone,n=1)
BN_wydawnictwo$same_a2 <- lead(BN_wydawnictwo$same_a,n=1)
BN_wydawnictwo$podzielone <- ifelse(BN_wydawnictwo$same_a2==1,paste(BN_wydawnictwo$podzielone,BN_wydawnictwo$podzielone3,sep = ""),as.character(BN_wydawnictwo$podzielone))
BN_wydawnictwo <- BN_wydawnictwo %>%
  filter(same_a==0)
BN_wydawnictwo$podzielone2 <- lag(BN_wydawnictwo$podzielone,n=1)

BN_wydawnictwo$podzielone <- ifelse(BN_wydawnictwo$same==0&BN_wydawnictwo$same2==1,paste(BN_wydawnictwo$podzielone,BN_wydawnictwo$podzielone2,sep = "|"),as.character(BN_wydawnictwo$podzielone))
BN_wydawnictwo <- cSplit(BN_wydawnictwo,"podzielone", sep = "|", direction = "long")
BN_wydawnictwo$bez_roku <- BN_wydawnictwo$podzielone
BN_wydawnictwo <- BN_wydawnictwo %>%
  select(licznik,rok_wydania,X260,bez_roku)
BN_wydawnictwo$rok_wydania <- as.character(BN_wydawnictwo$rok_wydania)
BN_wydawnictwo <- ddply(BN_wydawnictwo, .(licznik, rok_wydania, X260), summarize, bez_roku = paste(bez_roku, collapse=""))
BN_wydawnictwo$bez_roku <- str_remove_all(BN_wydawnictwo$bez_roku,"\\~")
#drugi raz
BN_wydawnictwo$bez_roku <- str_replace_all(BN_wydawnictwo$bez_roku, ";\\$b", ":$b")
BN_wydawnictwo <- mutate(BN_wydawnictwo,
                      ile_wydawnictw = str_count(BN_wydawnictwo$bez_roku, "\\$b"),
                      ile_miejsc = str_count(BN_wydawnictwo$bez_roku, "\\$a"),
                      kolejnosc = str_remove(str_replace_all(as.character(str_extract_all(BN_wydawnictwo$bez_roku, "\\$.")), "[^a-z]", ""),"^c"),
                      podzielone = str_replace_all(BN_wydawnictwo$bez_roku,"(\\$.)","|\\1~"))

BN_wydawnictwo$podzielone <- str_remove(BN_wydawnictwo$podzielone,"^\\|")
BN_wydawnictwo$kolejnosc <- str_replace_all(BN_wydawnictwo$kolejnosc,"(.)","\\1|")
BN_wydawnictwo$kolejnosc <- str_remove(BN_wydawnictwo$kolejnosc,"\\|$")
BN_wydawnictwo <- cSplit(BN_wydawnictwo,c("kolejnosc","podzielone"), sep = "|", direction = "long")
BN_wydawnictwo <- BN_wydawnictwo %>%
  filter(!is.na(podzielone))

BN_wydawnictwo %$%  
    { licznik == dplyr::lag(licznik, 1) & kolejnosc == dplyr::lag(kolejnosc, 1) } %>% 
    as.numeric() %>% 
    {.} -> BN_wydawnictwo$same
BN_wydawnictwo$same[1] <- 0

BN_wydawnictwo %$%  
    { licznik == dplyr::lag(licznik, 1) & kolejnosc == "b" & kolejnosc == dplyr::lead(kolejnosc, 1) } %>% 
    as.numeric() %>% 
    {.} -> BN_wydawnictwo$same2
BN_wydawnictwo$same2[length(BN_wydawnictwo$podzielone)] <- 0

BN_wydawnictwo$podzielone2 <- lag(BN_wydawnictwo$podzielone,n=1)
BN_wydawnictwo %$%  
    { licznik == dplyr::lag(licznik, 1) & kolejnosc == "a" & kolejnosc == dplyr::lag(kolejnosc, 1) } %>% 
    as.numeric() %>% 
    {.} -> BN_wydawnictwo$same_a
BN_wydawnictwo$same_a[1] <- 0

BN_wydawnictwo$podzielone3 <- lead(BN_wydawnictwo$podzielone,n=1)
BN_wydawnictwo$same_a2 <- lead(BN_wydawnictwo$same_a,n=1)
BN_wydawnictwo$podzielone <- ifelse(BN_wydawnictwo$same_a2==1,paste(BN_wydawnictwo$podzielone,BN_wydawnictwo$podzielone3,sep = ""),as.character(BN_wydawnictwo$podzielone))
BN_wydawnictwo <- BN_wydawnictwo %>%
  filter(same_a==0)
BN_wydawnictwo$podzielone2 <- lag(BN_wydawnictwo$podzielone,n=1)

BN_wydawnictwo$podzielone <- ifelse(BN_wydawnictwo$same==0&BN_wydawnictwo$same2==1,paste(BN_wydawnictwo$podzielone,BN_wydawnictwo$podzielone2,sep = "|"),as.character(BN_wydawnictwo$podzielone))
BN_wydawnictwo <- cSplit(BN_wydawnictwo,"podzielone", sep = "|", direction = "long")
BN_wydawnictwo$bez_roku <- BN_wydawnictwo$podzielone
BN_wydawnictwo <- BN_wydawnictwo %>%
  select(licznik,rok_wydania,X260,bez_roku)
BN_wydawnictwo$rok_wydania <- as.character(BN_wydawnictwo$rok_wydania)
BN_wydawnictwo$czy <- str_detect(BN_wydawnictwo$bez_roku,"\\$a")
BN_wydawnictwo$bez_roku <- ifelse(BN_wydawnictwo$czy==TRUE,paste("|",BN_wydawnictwo$bez_roku,sep = ""),as.character(BN_wydawnictwo$bez_roku))
BN_wydawnictwo <- ddply(BN_wydawnictwo, .(licznik, rok_wydania, X260), summarize, bez_roku = paste(bez_roku, collapse=""))
BN_wydawnictwo$bez_roku <- str_remove_all(BN_wydawnictwo$bez_roku,"\\~")
BN_wydawnictwo$bez_roku <- str_remove_all(BN_wydawnictwo$bez_roku,"^\\|")

BN_wydawnictwo <- cSplit(BN_wydawnictwo, "bez_roku", sep = "|", direction = "long")
BN_wydawnictwo <- mutate(BN_wydawnictwo,
                  wydawnictwo = str_extract_all(BN_wydawnictwo$bez_roku, "(?<=\\$b)(.*)"),
                  miejsce_wydania = str_replace_all(str_extract_all(BN_wydawnictwo$bez_roku, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
                  nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(BN_wydawnictwo$bez_roku), "\\$\\w", ""), "\\W", "")),
                  lp = 1:lengths(BN_wydawnictwo))
BN_wydawnictwo$wydawnictwo <- str_remove(BN_wydawnictwo$wydawnictwo,"\\s+\\;$")
BN_wydawnictwo$wydawnictwo <- str_remove(BN_wydawnictwo$wydawnictwo,"\\s+\\:$")

BN_wydawnictwo$miejsce_wydania <- str_remove(BN_wydawnictwo$miejsce_wydania," \\[{0,10}etc\\.{0,10}\\]\\s{0,10}$")
BN_wydawnictwo$miejsce_wydania <- str_remove(BN_wydawnictwo$miejsce_wydania," \\[{0,10}etc\\.{0,10}\\s{0,10}$")
BN_wydawnictwo$miejsce_wydania <- ifelse(grepl("\\[",BN_wydawnictwo$miejsce_wydania)&!grepl("\\]",BN_wydawnictwo$miejsce_wydania),str_remove(BN_wydawnictwo$miejsce_wydania,"\\["),as.character(BN_wydawnictwo$miejsce_wydania))
BN_wydawnictwo$wydawnictwo <- ifelse(grepl("\\]",BN_wydawnictwo$wydawnictwo)&!grepl("\\[",BN_wydawnictwo$wydawnictwo),str_remove(BN_wydawnictwo$wydawnictwo,"\\]"),as.character(BN_wydawnictwo$wydawnictwo))
BN_PBL_wydawnictwa <- merge( x = BN_wydawnictwo, y = PBL_wydawnictwa, by = 'nazwa_prosta', sort = FALSE, all.x = TRUE, allow.cartesian = TRUE)
BN_PBL_wydawnictwa$to_samo <- BN_PBL_wydawnictwa$wydawnictwo==BN_PBL_wydawnictwa$WY_NAZWA
BN_PBL_wydawnictwa <- BN_PBL_wydawnictwa[order(as.integer(as.character(BN_PBL_wydawnictwa$licznik)), -BN_PBL_wydawnictwa$to_samo, -BN_PBL_wydawnictwa$WY_LICZBA_ZAPISOW),]

BN_PBL_wydawnictwa %$%  
    { as.integer(licznik) == dplyr::lag(as.integer(licznik), 1) & nazwa_prosta==lag(nazwa_prosta)} %>% 
    as.numeric() %>% 
    {.} -> BN_PBL_wydawnictwa$same
BN_PBL_wydawnictwa$same[1] <- 0

BN_PBL_wydawnictwa <- BN_PBL_wydawnictwa %>%
  filter(same==0)

wy_wydawnictwo_id <- BN_PBL_wydawnictwa %>%
  select(licznik, WY_WYDAWNICTWO_ID)

wy_wydawnictwo_id <- wy_wydawnictwo_id[order(as.integer(as.character(wy_wydawnictwo_id$licznik))),]
#26
wy_miejsce <- BN_PBL_wydawnictwa %>%
  select(licznik, WY_WYDAWNICTWO_ID,miejsce_wydania)
wy_miejsce$miejsce_wydania <- ifelse(is.na(wy_miejsce$WY_WYDAWNICTWO_ID),as.character(wy_miejsce$miejsce_wydania),"")

#27
wy_nazwa <- BN_PBL_wydawnictwa %>%
  select(licznik, WY_WYDAWNICTWO_ID,wydawnictwo)
wy_nazwa$wydawnictwo <- ifelse(is.na(wy_miejsce$WY_WYDAWNICTWO_ID),as.character(wy_nazwa$wydawnictwo),"")

#28
za_rok_wydania <- BN_PBL_wydawnictwa %>%
  select(licznik, rok_wydania) %>%
  unique()
za_rok_wydania$rok_wydania <- str_replace_all(za_rok_wydania$rok_wydania, "(.*)(\\.)", "\\1")
za_rok_wydania$dobry_rok <- ifelse(nchar(as.character(za_rok_wydania$rok_wydania))==4,as.character(za_rok_wydania$rok_wydania),NA)
za_rok_wydania$do_opisu <- ifelse(is.na(za_rok_wydania$dobry_rok),paste("[",str_extract(za_rok_wydania$rok_wydania,"\\d{4}"),"]",sep = ""),"")
#29
marc_field300 <- data %>%
  select(licznik,X300)
marc_field300$X300<-str_remove_all(marc_field300$X300,"^\\|")
marc_field300 <- mutate(marc_field300,
               indicator = str_replace_all(marc_field300$X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field300)[1]))
colnames(empty_table) <-subfield_list

marc_field300<-cbind(marc_field300,empty_table)

subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)

for (i in x) {
  marc_field300$X300 <- str_replace(marc_field300$X300,subfield_list_char[i],"|\\1")
  progress(match(i,x), max.value = length(x)) 
}
for (i in x) {
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
string_a <- "(^)(.*?\\|"
string_b <- subfield_list_char2[i]
string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
string <- paste(string_a,string_b,string_c,sep = "")
marc_field300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field300$X300),str_replace_all(gsub(string,"\\3",marc_field300$X300),"\\${2}.", "~"),NA)
progress(match(i,x), max.value = length(x))  
}
marc_field300$`$a` <- str_remove(marc_field300$`$a`," \\;+$| \\:+$")
marc_field300$`$a`[is.na(marc_field300$`$a`)] <- ""

za_opis_ks <- data.frame(opis_ks = paste(za_rok_wydania$do_opisu, marc_field300$`$a`,marc_field300$`$b`,sep = ", "), licznik = as.integer(za_rok_wydania$licznik))
za_opis_ks$opis_ks <- str_replace(za_opis_ks$opis_ks,", , ", ", ")
za_opis_ks$opis_ks <- str_replace(za_opis_ks$opis_ks,", , ", ", ")
za_opis_ks$opis_ks <- str_remove_all(za_opis_ks$opis_ks, "^, |, $")
wsp_info <- data.frame(wsp = paste("[Współwyd.: ",BN_autor$autorzy,": ",za_tytul_copy$tytul,"]", sep = ""), za_uwagi)
wsp_info$za_uwagi <- str_remove_all(wsp_info$za_uwagi,"_2")
wsp_info %$%  
    { za_uwagi == dplyr::lag(za_uwagi, 1)} %>% 
    as.numeric() %>% 
    {.} -> wsp_info$same
wsp_info$same[1] <- 0
wsp_info <- data.frame(wsp_info, za_uwagi)
wsp_info$za_uwagi <- ifelse(grepl("_2", wsp_info$za_uwagi.1), as.character(wsp_info$za_uwagi),paste(wsp_info$za_uwagi,"_2",sep = ""))

wsp_info <- wsp_info %>%
  select(1,2)
wsp_info <- merge(x=wsp_info, y=za_uwagi, by = "za_uwagi")
wsp_info <- wsp_info %>%
  select(2,3)
za_opis_fizyczny_ksiazki <- merge(x=za_opis_ks,y=wsp_info, by = "licznik",all = TRUE)
za_opis_fizyczny_ksiazki <- data.frame(za_opis_fizyczny_ksiazki = paste(str_replace_all(za_opis_fizyczny_ksiazki$opis_ks,"(.*)(cm\\.)(.*)", "\\1\\2"), za_opis_fizyczny_ksiazki$wsp, sep = " "), licznik = za_opis_fizyczny_ksiazki$licznik)

#30
marc_field490 <- data %>%
  select(licznik,X490)
marc_field490 <- cSplit(marc_field490,"X490",sep = "|",direction = "long")
marc_field490 <- marc_field490%>%
  filter(X490!="")
marc_field490$X490<-str_remove_all(marc_field490$X490,"^\\|")
marc_field490 <- mutate(marc_field490,
               indicator = str_replace_all(marc_field490$X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field490)[1]))
colnames(empty_table) <-subfield_list

marc_field490<-cbind(marc_field490,empty_table)

subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)

for (i in x) {
  marc_field490$X490 <- str_replace(marc_field490$X490,subfield_list_char[i],"|\\1")
  progress(match(i,x), max.value = length(x)) 
}
for (i in x) {
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
string_a <- "(^)(.*?\\|"
string_b <- subfield_list_char2[i]
string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
string <- paste(string_a,string_b,string_c,sep = "")
marc_field490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field490$X490),str_replace_all(gsub(string,"\\3",marc_field490$X490),"\\${2}.", "~"),NA)
progress(match(i,x), max.value = length(x))  
}

marc_field490$`$a` <- str_remove(marc_field490$`$a`," \\;+$| \\:+$")
marc_field490$`$a`[is.na(marc_field490$`$a`)] <- ""
marc_field490$`$v`[is.na(marc_field490$`$v`)] <- ""
marc_field490$seria <- str_remove(paste("(",marc_field490$`$a`,", ",marc_field490$`$v`,")",sep = ""),", (?=\\)$)")

marc_field490 <- marc_field490 %>%
  select(licznik,seria)

marc_field490 <- ddply(marc_field490, .(licznik), summarize, seria = paste(seria, collapse=" "))
test <- data %>%
  select(licznik)
za_seria_wydawnicza <- merge(x = test, y = marc_field490, by = "licznik", all = TRUE)
#31
za_tomy <-data.frame(licznik=1:lengths(data), za_tomy = NA)
#32
pracownik <- merge(x = dz_nazwa_full, y = redaktorzy_dzialow, by.x = "TW_DZ_DZIAL_ID", by.y =  "DZ_DZIAL_ID", all.x = TRUE)
pracownik <- pracownik[order(as.integer(as.character(pracownik$licznik))),]
pracownik <- pracownik %>%
  select(licznik,redaktor_dzialu)
colnames(pracownik) <- c("licznik", "pracownik")

dz_nazwa_full <- data.frame(dz_nazwa_full, pracownik = pracownik$pracownik)
#33 adnotacje
za_adnotacje <- data.frame(cbind(data$licznik, data$X505))
colnames(za_adnotacje) <- c("licznik","X505")
za_adnotacje$X505 <- ifelse(is.na(za_adnotacje$X505),"",as.character(za_adnotacje$X505))
za_adnotacje$adnotacje <- paste(za_adnotacje$adnotacje,za_adnotacje$X505,sep = "|")
za_adnotacje$adnotacje[za_adnotacje$adnotacje=="|"] <- ""
za_adnotacje <- za_adnotacje %>%
  select(1,2)
#łączenie
#wyrównanie liczby wierszy
autorzy <- data.frame(cbind(am_autor_id$licznik,am_autor_id$AM_AUTOR_ID,as.character(am_nazwisko$am_nazwisko),as.character(am_imie$am_imie)))
colnames(autorzy) <- c("licznik", "AM_AUTOR_ID", "AM_NAZWISKO", "AM_IMIE")
autorzy$AM_AUTOR_ID <- ifelse(is.na(autorzy$AM_AUTOR_ID),"",as.character(autorzy$AM_AUTOR_ID))
autorzy$AM_NAZWISKO <- ifelse(is.na(autorzy$AM_NAZWISKO),"",as.character(autorzy$AM_NAZWISKO))
autorzy$AM_IMIE <- ifelse(is.na(autorzy$AM_IMIE),"",as.character(autorzy$AM_IMIE))
autorzy <- ddply(autorzy, .(licznik), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
autorzy <- autorzy[order(as.integer(as.character(autorzy$licznik))),]

wspoltworcy <- data.frame(cbind(BN_PBL_wspoltworcy$licznik, BN_PBL_wspoltworcy$OS_OSOBA_ID,as.character(b_os_nazwisko$os_nazwisko),as.character(b_os_imie$os_imie),BN_PBL_wspoltworcy$fo_symbol))
colnames(wspoltworcy) <- c("licznik", "OS_OSOBA_ID", "OS_NAZWISKO", "OS_IMIE", "FO_SYMBOL")
wspoltworcy$OS_OSOBA_ID <- ifelse(is.na(wspoltworcy$OS_OSOBA_ID),"",as.character(wspoltworcy$OS_OSOBA_ID))
wspoltworcy$OS_NAZWISKO <- ifelse(is.na(wspoltworcy$OS_NAZWISKO),"",as.character(wspoltworcy$OS_NAZWISKO))
wspoltworcy$OS_IMIE <- ifelse(is.na(wspoltworcy$OS_IMIE),"",as.character(wspoltworcy$OS_IMIE))
wspoltworcy$FO_SYMBOL <- ifelse(is.na(wspoltworcy$FO_SYMBOL),"",as.character(wspoltworcy$FO_SYMBOL))
wspoltworcy <- ddply(wspoltworcy, .(licznik), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), FO_SYMBOL = paste(FO_SYMBOL, collapse="|"))
wspoltworcy <- wspoltworcy[order(as.integer(as.character(wspoltworcy$licznik))),]

wydawnictwa <- data.frame(cbind(wy_wydawnictwo_id$licznik, wy_wydawnictwo_id$WY_WYDAWNICTWO_ID,wy_nazwa$wydawnictwo,wy_miejsce$miejsce_wydania))
colnames(wydawnictwa) <- c("licznik", "WY_WYDAWNICTWO_ID", "WY_NAZWA", "WY_MIEJSCE")
wydawnictwa$WY_WYDAWNICTWO_ID <- ifelse(is.na(wydawnictwa$WY_WYDAWNICTWO_ID),"",as.character(wydawnictwa$WY_WYDAWNICTWO_ID))
wydawnictwa$WY_NAZWA <- ifelse(is.na(wydawnictwa$WY_NAZWA),"",as.character(wydawnictwa$WY_NAZWA))
wydawnictwa$WY_MIEJSCE <- ifelse(is.na(wydawnictwa$WY_MIEJSCE),"",as.character(wydawnictwa$WY_MIEJSCE))
wydawnictwa <- ddply(wydawnictwa, .(licznik), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIEJSCE = paste(WY_MIEJSCE, collapse="|"))
wydawnictwa <- wydawnictwa[order(as.integer(as.character(wydawnictwa$licznik))),]

polaczone <- data.frame(
  licznik = za_uwagi$licznik,
  rekord_BN = za_uwagi$za_uwagi,
  rz_nazwa = rz_nazwa$rz_nazwa,
  za_ro_rok = za_ro_rok$za_ro_rok,
  za_type = za_type$za_type,
  rz_rodzaj_id = rz_rodzaj_id$RZ_RODZAJ_ID,
  DZ_NAZWA = dz_nazwa$DZ_NAZWA,
  DZ_DZIAL_ID = dz_dzial_id$DZ_DZIAL_ID,
  tw_tworca_id = tw_tworca_id$TW_TWORCA_ID,
  am_autor_id = autorzy$AM_AUTOR_ID,
  am_nazwisko = autorzy$AM_NAZWISKO,
  am_imie = autorzy$AM_IMIE,
  za_tytul = za_tytul$tytul,
  za_tytul_oryginalu = za_tytul_oryginalu$tytul,
  za_jezyk_oryginalu = za_jezyk_oryginalu$jezyk_oryginalu,
  os_osoba_id = wspoltworcy$OS_OSOBA_ID,
  os_nazwisko = wspoltworcy$OS_NAZWISKO,
  os_imie = wspoltworcy$OS_IMIE,
  fo_symbol = wspoltworcy$FO_SYMBOL,
  za_opis_wspoltworcow = za_opis_wspoltworcow$za_opis_wspoltworcow,
  za_wydanie = za_wydanie$za_wydanie,
  za_tomy = za_tomy$za_tomy,
  za_instytucja = za_instytucja$instytucja,
  wy_wydawnictwo_id = wydawnictwa$WY_WYDAWNICTWO_ID,
  wy_miejsce = wydawnictwa$WY_MIEJSCE,
  wy_nazwa = wydawnictwa$WY_NAZWA,
  za_rok_wydania = za_rok_wydania$dobry_rok,
  za_opis_fizyczny_ksiazki = za_opis_fizyczny_ksiazki$za_opis_fizyczny_ksiazki,
  za_seria_wydawnicza = za_seria_wydawnicza$seria,
  tw_nazwisko = tw_nazwisko$TW_NAZWISKO,
  tw_imie = tw_imie$TW_IMIE,
  pracownik = pracownik$pracownik,
  za_adnotacje = za_adnotacje$X505
)

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long")
out <- out %>%
  unique()
out$licznik <- ifelse(is.na(out$licznik),'',as.character(out$licznik))
out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))

out %$%  
    { licznik == dplyr::lag(licznik, 1) & rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { licznik == dplyr::lag(licznik, 1) & rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""

out <- out %>%
  select(1:33)
write.csv2(out, "C:/Users/Cezary/Desktop/2005-2008_harlequiny_do_importu.csv", row.names = F, na = '', fileEncoding = 'Windows-1250')
#out <- read.csv2("C:/Users/Cezary/Desktop/2005-2008_podmiotowa_do_importu.csv", encoding = "Windows-1250", header = TRUE, stringsAsFactors = FALSE)
#out$rekord_BN <- ifelse(is.na(out$rekord_BN),"", as.character(out$rekord_BN))
#out$rekord_BN <- ifelse(nchar(out$rekord_BN)==13,out$rekord_BN, sprintf("%013d", as.integer(out$rekord_BN)))
#out$rekord_BN[out$rekord_BN=="           NA"] <- ""
#twórcy
memory.limit(100000)
nowi_tworcy <- out %>%
  select(licznik, tw_nazwisko, tw_imie)
nowi_tworcy <- nowi_tworcy %>%
  filter(tw_nazwisko!="")
nowi_tworcy <- nowi_tworcy[order(nowi_tworcy$tw_nazwisko, nowi_tworcy$tw_nazwisko, as.integer(as.character(nowi_tworcy$licznik))),]
nowi_tworcy %$%  
    { tw_nazwisko==lag(tw_nazwisko,1) & tw_imie==lag(tw_imie,)} %>% 
    as.numeric() %>% 
    {.} -> nowi_tworcy$same
nowi_tworcy$same[1] <- 0
nowi_tworcy <- nowi_tworcy %>%
  filter(same==0) %>%
  select(-same)
nazwa <- ifelse(is.na(nowi_tworcy$tw_imie),as.character(nowi_tworcy$tw_nazwisko),paste(nowi_tworcy$tw_nazwisko,nowi_tworcy$tw_imie, sep = ""))
nazwa <- data.frame(nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")))
nowi_tworcy <- data.frame(nowi_tworcy,nazwa)
tworcy_pbl <- PBL_tworcy %>%
  select(1,2,3,18)

x <- 1:length(nowi_tworcy$licznik)

tworcy_check <- data.frame(licznik = as.character(), bn_nazwisko = as.character(), bn_imie = as.character(), n_aut = as.character(), TW_TWORCA_ID = as.character(), TW_NAZWISKO = as.character(), TW_IMIE = as.character(), V1 = as.character(), stringsAsFactors=FALSE)
for (i in x) {
progress(i, max.value = length(x))
lkj <- as.matrix(stringdistmatrix(a=nowi_tworcy$nazwa[i],b=tworcy_pbl$nazwa, method = "jw"))
lkj <- data.frame(V1 = as.vector(lkj))
kjh <- data.frame(licznik = rep(nowi_tworcy$licznik[i], length(tworcy_pbl$nazwa)), bn_nazwisko = rep(nowi_tworcy$tw_nazwisko[i], length(tworcy_pbl$nazwa)), bn_imie = rep(nowi_tworcy$tw_imie[i], length(tworcy_pbl$nazwa)), n_aut = rep(nowi_tworcy$nazwa[i], length(tworcy_pbl$nazwa)), tworcy_pbl, lkj)
kjh <- kjh[order(kjh$V1),]
kjh <- kjh %>%
  top_n(-5,V1)
tworcy_check <- rbind(tworcy_check,kjh)
}
write.csv2(tworcy_check, "C:/Users/Cezary/Desktop/2005-2008_tworcy_check_har.csv", row.names = F, na = '', fileEncoding = 'Windows-1250')

#wydawnictwa
nowe_wydawnictwo <- out %>%
  select(licznik, wy_miejsce, wy_nazwa)
nowe_wydawnictwo <- nowe_wydawnictwo %>%
  filter(wy_miejsce!="")
nowe_wydawnictwo <- nowe_wydawnictwo[order(nowe_wydawnictwo$wy_nazwa, nowe_wydawnictwo$wy_miejsce, as.integer(as.character(nowe_wydawnictwo$licznik))),]
nowe_wydawnictwo %$%  
    { wy_nazwa==lag(wy_nazwa,1) & wy_miejsce==lag(wy_miejsce,)} %>% 
    as.numeric() %>% 
    {.} -> nowe_wydawnictwo$same
nowe_wydawnictwo$same[1] <- 0
nowe_wydawnictwo <- nowe_wydawnictwo %>%
  filter(same==0) %>%
  select(-same)
nazwa <- ifelse(is.na(nowe_wydawnictwo$wy_nazwa),as.character(nowe_wydawnictwo$wy_miejsce),paste(nowe_wydawnictwo$wy_miejsce,nowe_wydawnictwo$wy_nazwa, sep = ""))
nazwa <- data.frame(nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")))
nowe_wydawnictwo <- data.frame(nowe_wydawnictwo,nazwa)
wydawnictwa_pbl <- PBL_wydawnictwa %>%
  select(1,3,2,10)

x <- 1:length(nowe_wydawnictwo$licznik)

wydawnictwa_check <- data.frame(licznik = as.character(), bn_miejsce = as.character(), bn_nazwa = as.character(), n_aut = as.character(), WY_WYDAWNICTWO_ID = as.character(), WY_MIEJSCE = as.character(), WY_NAZWA = as.character(), V1 = as.character(), stringsAsFactors=FALSE)
for (i in x) {
progress(i, max.value = length(x))
lkj <- as.matrix(stringdistmatrix(a=nowe_wydawnictwo$nazwa[i],b=wydawnictwa_pbl$nazwa_prosta, method = "jw"))
lkj <- data.frame(V1 = as.vector(lkj))
kjh <- data.frame(licznik = rep(nowe_wydawnictwo$licznik[i], length(wydawnictwa_pbl$nazwa_prosta)), bn_miejsce = rep(nowe_wydawnictwo$wy_miejsce[i], length(wydawnictwa_pbl$nazwa_prosta)), bn_nazwa = rep(nowe_wydawnictwo$wy_nazwa[i], length(wydawnictwa_pbl$nazwa_prosta)), n_aut = rep(nowe_wydawnictwo$nazwa[i], length(wydawnictwa_pbl$nazwa_prosta)), wydawnictwa_pbl, lkj)
kjh <- kjh[order(kjh$V1),]
kjh <- kjh %>%
  top_n(-5,V1)
wydawnictwa_check <- rbind(wydawnictwa_check,kjh)
}
write.csv2(wydawnictwa_check, "C:/Users/Cezary/Desktop/2005-2008_wydawnictwa_check_har.csv", row.names = F, na = '', fileEncoding = 'Windows-1250')
#tworcy
tworcy_check_har <- gs_read(gs_title("2005-2008_tworcy_check_har"))
tworcy_check_har <- tworcy_check_har %>%
  filter(decyzja=="tak") %>%
  select(bn_nazwisko, bn_imie, TW_TWORCA_ID)
tworcy_check_har$merge_tworcy <- paste(tworcy_check_har$bn_nazwisko,tworcy_check_har$bn_imie,sep = "|")
out$merge_tworcy <- paste(out$tw_nazwisko,out$tw_imie,sep = "|")

final <- merge(x=out, y=tworcy_check_har, by = "merge_tworcy", all.x = TRUE)
final <-final[order(as.integer(as.character(final$licznik)), final$DZ_NAZWA, final$am_autor_id, final$am_nazwisko, final$os_osoba_id, final$os_nazwisko, final$wy_wydawnictwo_id, final$wy_nazwa),]

final$TW_TWORCA_ID[final$tw_nazwisko==""|final$tw_nazwisko!=final$bn_nazwisko] <- NA
final$bn_nazwisko[final$tw_nazwisko==""|final$tw_nazwisko!=final$bn_nazwisko] <- NA
final$bn_imie[final$tw_nazwisko==""|final$tw_nazwisko!=final$bn_nazwisko] <- NA

final <- mutate(final,
                napr = ifelse(final$tw_tworca_id=="",as.character(final$TW_TWORCA_ID),as.character(final$tw_tworca_id)))
final$tw_tworca_id <- final$napr

final$tw_imie <- ifelse(is.na(final$tw_tworca_id),as.character(final$tw_imie),NA)
final$tw_nazwisko <- ifelse(is.na(final$tw_tworca_id),as.character(final$tw_nazwisko),NA)
final <- final %>% 
  select(2:34)

#wydawnictwa
wydawnictwa_check_har <- gs_read(gs_title("2005-2008_wydawnictwa_check_har"))
wydawnictwa_check_har <- wydawnictwa_check_har %>%
  filter(decyzja=="tak") %>%
  select(bn_nazwa,bn_miejsce,WY_WYDAWNICTWO_ID)

wydawnictwa_check_har$bn_miejsce <- str_remove(wydawnictwa_check_har$bn_miejsce," \\[{0,10}etc\\.{0,10}\\]\\s{0,10}$")
wydawnictwa_check_har$bn_nazwa <- str_remove(wydawnictwa_check_har$bn_nazwa," \\[{0,10}etc\\.{0,10}\\s{0,10}$")
wydawnictwa_check_har$bn_miejsce <- ifelse(grepl("\\[",wydawnictwa_check_har$bn_miejsce)&!grepl("\\]",wydawnictwa_check_har$bn_miejsce),str_remove(BN_wydawnictwo$bn_miejsce,"\\["),as.character(wydawnictwa_check_har$bn_miejsce))
wydawnictwa_check_har$bn_nazwa <- ifelse(grepl("\\]",wydawnictwa_check_har$bn_nazwa)&!grepl("\\[",wydawnictwa_check_har$bn_nazwa),str_remove(wydawnictwa_check_har$bn_nazwa,"\\]"),as.character(wydawnictwa_check_har$bn_nazwa))

wydawnictwa_check_har$merge_wyd <- paste(wydawnictwa_check_har$bn_nazwa,wydawnictwa_check_har$bn_miejsce,sep = "|")
final$merge_wyd <- paste(final$wy_nazwa,final$wy_miejsce,sep = "|")

final <- merge(x=final, y=wydawnictwa_check_har, by = "merge_wyd", all.x = TRUE)

final <-final[order(as.integer(as.character(final$licznik)), final$DZ_NAZWA, final$am_autor_id, final$am_nazwisko, final$os_osoba_id, final$os_nazwisko, final$wy_wydawnictwo_id, final$wy_nazwa),]

final$WY_WYDAWNICTWO_ID[final$wy_nazwa==""&is.na(final$wy_miejsce)] <- NA
final$wy_miejsce[final$wy_nazwa==""&is.na(final$wy_miejsce)] <- NA
final$wy_nazwa[final$wy_nazwa==""&is.na(final$wy_miejsce)] <- NA

final <- mutate(final,
                napr = ifelse(final$wy_wydawnictwo_id=="",as.character(final$WY_WYDAWNICTWO_ID),as.character(final$wy_wydawnictwo_id)))
final$wy_wydawnictwo_id <- final$napr

final$wy_miejsce <- ifelse(is.na(final$wy_wydawnictwo_id),as.character(final$wy_miejsce),NA)
final$wy_nazwa <- ifelse(is.na(final$wy_wydawnictwo_id),as.character(final$wy_nazwa),NA)
final <- final %>%
  select(2:34)
final$rekord_BN <- ifelse(final$rekord_BN=="","",paste("'",final$rekord_BN,sep = ""))
write.csv2(final, "C:/Users/Cezary/Desktop/2005_2008_harlequiny_gotowe.csv", row.names = F, na = '', fileEncoding = 'Windows-1250')
#write.csv2(final, "C:/Users/cezar/Desktop/gotowe.csv", row.names = F, na = '', fileEncoding = 'Windows-1250')
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KY2VsOiBhdXRvbWF0eWN6bmllIElNUE9SVCBPSyBjbyBzacSZIGRhOyBJTVBPUlQgLSA1MDAwIHphcGlzw7N3IHogdWtkIGkgZGVza3J5cHRvcmFtaSBuYWpiYXJkemllaiBsaXRlcmFja2ltaTsgcmVzenRhIG5pZSB3Y2hvZHppDQpgYGB7ciBXY3p5dGFuaWUgcGxpa8Ozd30NCiNiaWJsaW90ZWtpDQpvcHRpb25zKGphdmEucGFyYW1ldGVycyA9ICItWG14MzIwMDBtIikNCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KcGFjbWFuOjpwX2xvYWQodXRmOCxnb29nbGVzaGVldHM0LHpvbyxzdHJpbmdyLHNwbGl0c3RhY2tzaGFwZSxwbHlyLGRwbHlyLHNxbGRmLHN0cmluZ2Rpc3QsZnV6enlqb2luLGRhdGEudGFibGUsc3ZNaXNjLHRpZHl2ZXJzZSxSSkRCQyxhcnJhbmdlbWVudHMsdG9rZW5pemVycyxvcGVueGxzeCkNCg0KI3BvxYLEhWN6ZW5pZSB6IGJhesSFIFBCTA0KamRiY0RyaXZlciA9SkRCQygib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIixjbGFzc1BhdGg9IkM6L1VzZXJzL0NlemFyeS9Eb3dubG9hZHMvb2pkYmM2LmphciIpDQpQQkwgPC0gZGJDb25uZWN0KGpkYmNEcml2ZXIsICJqZGJjOm9yYWNsZTp0aGluOkAvL3BibC5pYmwucG96bmFuLnBsOjE1MjEveGUiLCAiSUJMX1NFTEVDVCIsICJDUjMzMzQ0NCIpDQoNCiN3Z3JhbmllIHpiaW9yw7N3IGtzacSFxbxlaw0KYm5fa3MgPC0gcmVhZC5jc3YyKCJDOi9Vc2Vycy9DZXphcnkvRG93bmxvYWRzL2JuX2tzXzIwMDkuY3N2IiwgZW5jb2RpbmcgPSAiVVRGLTgiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJcXFxcJGFBcnR5a3XFgnl8XFxcXCREcnVraSB1bG90bmUiLFgzODApKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgiXFwkYU5hZGJpdGtpIGkgb2RiaXRraSIsWDY1NSkpICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIktzacSFxbxraSIsWDM4MCxpZ25vcmUuY2FzZSA9IEZBTFNFKXxYMzgwPT0iIikgJT4lDQogIGZpbHRlcihncmVwbCgiXFwkYVdBfFxcJGFXICIsWDA0MCkpICU+JQ0KICBmaWx0ZXIoWDY1NSE9IlxcNyRhS29taWtzJDJEQk4iKSAlPiUNCiAgbXV0YXRlKEJOX1VSTCA9IHBhc3RlKCJodHRwczovL2thdGFsb2dpLmJuLm9yZy5wbC9kaXNjb3ZlcnkvZnVsbGRpc3BsYXk/ZG9jaWQ9YWxtYSIsYXMuY2hhcmFjdGVyKFgwMDkpLCImY29udGV4dD1MJnZpZD00OE9NTklTX05MT1A6NDhPTU5JU19OTE9QJmxhbmc9cGwiLHNlcCA9ICIiKSkNCg0KIyMjIHByemVuaWXFm8SHIGtvbGVqbnljaCBhdXRvcsOzdyB6IDcwMCBkbyBwb2xhIDEwMA0KbWFyY19maWVsZF83MDAgPC0gYm5fa3MgJT4lDQogIHNlbGVjdChpZCxYNzAwKSU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGJuX2tzJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNzAwIDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBmaWx0ZXIoaXMubmEoYCRlYCkmaXMubmEoYCR0YCkpICU+JQ0KICBzZWxlY3QoaWQsIFg3MDApICU+JQ0KICBtdXRhdGUoZHJ1Z2lfYXV0b3IgPSBzdHJfcmVtb3ZlX2FsbChYNzAwLCJcXHwiKSkgJT4lDQogIHNlbGVjdChpZCxkcnVnaV9hdXRvcikNCg0KZHJ1Z2lfYXV0b3IgPC0gYm5fa3MgJT4lDQogIGZ1bGxfam9pbiguLG1hcmNfZmllbGRfNzAwLGJ5ID0gImlkIikgJT4lDQogIHNlbGVjdChpZCxYMTAwLFg3MDAsZHJ1Z2lfYXV0b3IpICU+JQ0KICBncm91cF9ieShpZCkgJT4lDQogIG11dGF0ZShYMTAwID0gaWZlbHNlKCFpcy5uYShkcnVnaV9hdXRvciksc3RyX3JlbW92ZShwYXN0ZShYMTAwLHBhc3RlKGRydWdpX2F1dG9yLGNvbGxhcHNlID0gInwiKSxzZXAgPSAifCIpLCJeXFx8IiksYXMuY2hhcmFjdGVyKFgxMDApKSwNCiAgICAgICAgIGRydWdpX2F1dG9yID0gbGlzdChkcnVnaV9hdXRvcikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpDQogIA0KeCA8LSAxOmxlbmd0aChkcnVnaV9hdXRvciRpZCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgeSA8LSAxOmxlbmd0aHMoZHJ1Z2lfYXV0b3IkZHJ1Z2lfYXV0b3JbaV0pDQogIGZvciAoaiBpbiB5KSB7DQogICAgZHJ1Z2lfYXV0b3IkWDcwMFtpXSA8LSBpZmVsc2UoaXMubmEoZHJ1Z2lfYXV0b3IkZHJ1Z2lfYXV0b3JbaV0pLGFzLmNoYXJhY3RlcihkcnVnaV9hdXRvciRYNzAwW2ldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbChzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwoZHJ1Z2lfYXV0b3IkZHJ1Z2lfYXV0b3JbaV1bWzFdXVtqXSwiXFxcXCIsIlxcXFxcXFxcIiksIlxcJCIsIlxcXFwkIiksIlxcKCIsIlxcXFwoIiksIlxcKSIsIlxcXFwpIiksZHJ1Z2lfYXV0b3IkWDcwMFtpXSksc3RyX3JlbW92ZShkcnVnaV9hdXRvciRYNzAwW2ldLHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbChkcnVnaV9hdXRvciRkcnVnaV9hdXRvcltpXVtbMV1dW2pdLCJcXFxcIiwiXFxcXFxcXFwiKSwiXFwkIiwiXFxcXCQiKSwiXFwoIiwiXFxcXCgiKSwiXFwpIiwiXFxcXCkiKSksYXMuY2hhcmFjdGVyKGRydWdpX2F1dG9yJFg3MDBbaV0pKSkNCiAgfQ0KfQ0KDQpkcnVnaV9hdXRvciA8LSBkcnVnaV9hdXRvciAlPiUNCiAgbXV0YXRlKFg3MDAgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKFxcfCkrIiwifCIpLA0KICAgICAgICAgWDcwMCA9IHN0cl9yZW1vdmUoWDcwMCwiXFx8fCQiKSwNCiAgICAgICAgIFg3MDAgPSBpZmVsc2UoWDcwMD09InwiLCIiLGFzLmNoYXJhY3RlcihYNzAwKSkpICU+JQ0KICBzZWxlY3QoaWQsWDEwMCxYNzAwKQ0KYm5fa3MgPC0gYm5fa3MgJT4lDQogIG11dGF0ZShYMTAwID0gZHJ1Z2lfYXV0b3IkWDEwMCwNCiAgICAgICAgIFg3MDAgPSBkcnVnaV9hdXRvciRYNzAwKQ0KDQojI2tvbmllYyBwcnplbm9zaW4NCmBgYA0KDQpgYGB7ciBnZW5lcm93YW5pZSBsaXN0eSB6YXBpc293IHogb3NvYmFtaSBQQkx9DQojd2N6eXRhbmllIGxpc3R5IHV0b8W8c2FtaW9ueWNoIHR3w7NyY8OzdyB6IGF1dG9yYW1pIEJODQpwYmxfdmlhZiA8LSBzaGVldHNfcmVhZChzcyA9ICIxY0V6NzNkR04ycjItVFRjNzAyeW5lOXRLZkg5UFE2VXlBSjJ6QlNWNkpiMCIpICU+JQ0KICBmaWx0ZXIoY3p5X3Rlbl9zYW0hPSJuaWUiKSAlPiUNCiAgc2VsZWN0KHBibF9pZCwgQk5faWQsIEJOX25hbWUpICU+JQ0KICBtdXRhdGUoQk5fbmFtZSA9IHN0cl9yZXBsYWNlX2FsbChCTl9uYW1lLCJcXHxcXCgiLCAiICgiKSwNCiAgICAgICAgIEJOX25hbWUgPSBzdHJfcmVwbGFjZV9hbGwoQk5fbmFtZSwgIlxcO1xcfCIsICI7ICIpKSAlPiUNCiAgY1NwbGl0KC4sIkJOX25hbWUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoQk5fbmFtZSE9IiIpDQpwYmxfdmlhZjIgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMV9CaHd6bzB4dTR5VG44dEYwWk5BWnE5aUlBcUl4ZmNyamVMVkNtX21nZ00iKSAlPiUNCiAgZmlsdGVyKGN6eV90ZW5fc2FtIT0ibmllIikgJT4lDQogIHNlbGVjdChwYmxfaWQsIEJOX2lkLCBCTl9uYW1lKSAlPiUNCiAgbXV0YXRlKEJOX25hbWUgPSBzdHJfcmVwbGFjZV9hbGwoQk5fbmFtZSwiXFx8XFwoIiwgIiAoIiksDQogICAgICAgICBCTl9uYW1lID0gc3RyX3JlcGxhY2VfYWxsKEJOX25hbWUsICJcXDtcXHwiLCAiOyAiKSkgJT4lDQogIGNTcGxpdCguLCJCTl9uYW1lIixzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKEJOX25hbWUhPSIiKQ0KcGJsX3ZpYWYgPC0gcmJpbmQocGJsX3ZpYWYscGJsX3ZpYWYyKSAlPiUNCiAgYXJyYW5nZShwYmxfaWQpICU+JQ0KICB1bmlxdWUoKQ0KcmVtb3ZlKHBibF92aWFmMikNCg0KI3pvc3Rhd2nEhyBkbyB0ZXN0b3dhbmlhLCBjenkgamVkbm8gaGFzxYJvIGJuIG5pZSB6YXNpbGEga2lsa3UgaGFzZcWCIHR3w7NyY8OzdyBwYmwNCiNwYmxfdmlhZiA8LSBzaGVldHNfcmVhZChzcyA9ICIxY0V6NzNkR04ycjItVFRjNzAyeW5lOXRLZkg5UFE2VXlBSjJ6QlNWNkpiMCIpICU+JQ0KIyAgZmlsdGVyKGN6eV90ZW5fc2FtIT0ibmllIikgJT4lDQojICBzZWxlY3QocGJsX2lkLCBCTl9pZCwgQk5fbmFtZSkNCiNwYmxfdmlhZjIgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMV9CaHd6bzB4dTR5VG44dEYwWk5BWnE5aUlBcUl4ZmNyamVMVkNtX21nZ00iKSAlPiUNCiMgIGZpbHRlcihjenlfdGVuX3NhbSE9Im5pZSIpICU+JQ0KIyAgc2VsZWN0KHBibF9pZCwgQk5faWQsIEJOX25hbWUpDQojcGJsX3ZpYWYgPC0gcmJpbmQocGJsX3ZpYWYscGJsX3ZpYWYyKSAlPiUNCiMgIGFycmFuZ2UocGJsX2lkKSAlPiUNCiMgIHVuaXF1ZSgpDQojDQojY291bnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShwYmxfdmlhZiRCTl9pZCkpDQojcGJsX3ZpYWYgPC0gbWVyZ2UocGJsX3ZpYWYsY291bnQsYnkueCA9ICJCTl9pZCIsYnkueSA9ICJWYXIxIixhbGwueCA9IFRSVUUpDQojcGJsX3ZpYWYgPC0gcGJsX3ZpYWYgJT4lDQojICB1bmlxdWUoKQ0KI2NvdW50MiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHBibF92aWFmJHBibF9pZCkpDQoNCiN1dG/FvHNhbWlhbmllIHBvIG5hemV3bmljdHdpZSB6IGluZm9ybWFjasSFIG8gZHppYWxlDQp0d29yY2FfaV9kemlhbCA8LSBkYkdldFF1ZXJ5KFBCTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCB0dy50d190d29yY2FfaWQgXCJwYmxfaWRcIiwgZHouZHpfZHppYWxfaWR8fCd8J3x8ZHouZHpfbmF6d2EgXCJvc29iYV9wYmxfZHppYWxfaWRfbmFtZVwiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBibF90d29yY3kgdHcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgam9pbiBwYmxfZHppYWx5IGR6IG9uIGR6LmR6X2R6aWFsX2lkPXR3LnR3X2R6X2R6aWFsX2lkIikNCg0KI2xpc3R5IG5hendpc2sgQk4gemUgemJpb3J1DQojMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBibl9rcyAlPiUNCiAgc2VsZWN0KGlkLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoYm5fa3MkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMTAwIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICBzZWxlY3QoaWQsYCRhYCxgJGRgLGAkY2ApICU+JQ0KICBtdXRhdGUobmFtZSA9IGlmZWxzZSghaXMubmEoYCRjYCkmc3Vic3RyKGAkY2AsbmNoYXIoYCRjYCksbmNoYXIoYCRjYCkpPT0iOyIscGFzdGUoYCRhYCxgJGNgLGAkZGAsc2VwID0gIiAiKSxpZmVsc2UoIWlzLm5hKGAkZGApLHBhc3RlKGAkYWAsYCRkYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpKSAlPiUNCiAgc2VsZWN0KGlkLG5hbWUpICU+JQ0KICBtdXRhdGUobmFtZSA9IHN0cl9yZXBsYWNlKG5hbWUsIihcXCkpKFxcLiQpIiwiXFwxIiksDQogICAgICAgICBuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwgIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIiwiXFwxIikpDQoNCm9zb2JhX2JuXzEwMF9wYmwgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBpbm5lcl9qb2luKC4scGJsX3ZpYWYsYnkgPSBjKCJuYW1lIiA9ICJCTl9uYW1lIikpICU+JQ0KICBzZWxlY3QoMTozKSAlPiUNCiAgbGVmdF9qb2luKC4sdHdvcmNhX2lfZHppYWwsYnkgPSAicGJsX2lkIikgJT4lDQogIHNlbGVjdChpZCxvc29iYV9wYmxfZHppYWxfaWRfbmFtZSkgJT4lDQogIGdyb3VwX2J5KGlkKSAlPiUNCiAgbXV0YXRlKG9zb2JhX2JuX2F1dG9yID0gcGFzdGUodW5pcXVlKG9zb2JhX3BibF9kemlhbF9pZF9uYW1lKSxjb2xsYXBzZSA9ICJ+IikpICU+JQ0KICBzZWxlY3QoLW9zb2JhX3BibF9kemlhbF9pZF9uYW1lKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQojNjAwDQptYXJjX2ZpZWxkXzYwMCA8LSBibl9rcyAlPiUNCiAgc2VsZWN0KGlkLFg2MDApJT4lDQogIGZpbHRlcihYNjAwIT0iIikgJT4lDQogIG11dGF0ZShYNjAwPXN0cl9yZXBsYWNlX2FsbChYNjAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDYwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDYwMD1zdHJfcmVtb3ZlX2FsbChYNjAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoYm5fa3MkWDYwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzYwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82MDA8LWNiaW5kKG1hcmNfZmllbGRfNjAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQoNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjAwJFg2MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82MDAkWDYwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82MDAkWDYwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjAwJFg2MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNjAwIDwtIG1hcmNfZmllbGRfNjAwICU+JQ0KICBzZWxlY3QoaWQsYCRhYCxgJGRgLGAkY2ApICU+JQ0KICBtdXRhdGUobmFtZSA9IGlmZWxzZSghaXMubmEoYCRjYCkmc3Vic3RyKGAkY2AsbmNoYXIoYCRjYCksbmNoYXIoYCRjYCkpPT0iOyIscGFzdGUoYCRhYCxgJGNgLGAkZGAsc2VwID0gIiAiKSxpZmVsc2UoIWlzLm5hKGAkZGApLHBhc3RlKGAkYWAsYCRkYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpKSAlPiUNCiAgc2VsZWN0KGlkLG5hbWUpICU+JQ0KICBtdXRhdGUobmFtZSA9IHN0cl9yZXBsYWNlKG5hbWUsIihcXCkpKFxcLiQpIiwiXFwxIiksDQogICAgICAgICBuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwgIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIiwiXFwxIikpDQpvc29iYV9ibl82MDBfcGJsIDwtIG1hcmNfZmllbGRfNjAwICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgaW5uZXJfam9pbiguLHBibF92aWFmLGJ5ID0gYygibmFtZSIgPSAiQk5fbmFtZSIpKSAlPiUNCiAgc2VsZWN0KDE6MykgJT4lDQogIGxlZnRfam9pbiguLHR3b3JjYV9pX2R6aWFsLGJ5ID0gInBibF9pZCIpICU+JQ0KICBzZWxlY3QoaWQsb3NvYmFfcGJsX2R6aWFsX2lkX25hbWUpICU+JQ0KICBncm91cF9ieShpZCkgJT4lDQogIG11dGF0ZShvc29iYV9ibl90ZW1hdCA9IHBhc3RlKHVuaXF1ZShvc29iYV9wYmxfZHppYWxfaWRfbmFtZSksY29sbGFwc2UgPSAifiIpKSAlPiUNCiAgc2VsZWN0KC1vc29iYV9wYmxfZHppYWxfaWRfbmFtZSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkNCg0KIyM3MDANCiNtYXJjX2ZpZWxkXzcwMCA8LSBibl9rcyAlPiUNCiMgIHNlbGVjdChpZCxYNzAwKSU+JQ0KIyAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiMgIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiMgIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiMgIGZpbHRlcihYNzAwIT0iIikgJT4lDQojICBtdXRhdGUoWDcwMD1zdHJfcmVtb3ZlX2FsbChYNzAwLCJeXFx8IikpICU+JQ0KIyAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQojc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9rcyRYNzAwLCJcXCQuIikNCiNzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCiNlbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCiNjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQojbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0KI3N1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQojc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCiN4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQojDQojZm9yIChpIGluIHgpIHsNCiMgIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQojICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCiN9DQojZm9yIChpIGluIHgpIHsNCiMgIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQojICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQojICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiMgIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiMgIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiMgIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiMgIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQojfQ0KI21hcmNfZmllbGRfNzAwIDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KIyAgc2VsZWN0KGlkLGAkYWAsYCRkYCxgJGNgKSAlPiUNCiMgIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KIyAgc2VsZWN0KGlkLG5hbWUpICU+JQ0KIyAgbXV0YXRlKG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCIoXFwpKShcXC4kKSIsIlxcMSIpLA0KIyAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkNCg0KIyMjc3ByYXdkemnEhyBjenkgbmllIG1hIHpkdWJsb3dhbmVnbyBtYXBvd2FuaWEgQk4tPlBCTCAoY3p5IG5wLiBqZWRuYSBvc29iYSB6IEJOIG5pZSB6YXNpbGEga2lsa3UgdHfDs3Jjw7N3IFBCTCkNCg0KYm5fa3MgPC0gYm5fa3MgJT4lDQogIGZ1bGxfam9pbiguLG9zb2JhX2JuXzEwMF9wYmwsYnkgPSAiaWQiKSAlPiUNCiAgZnVsbF9qb2luKC4sb3NvYmFfYm5fNjAwX3BibCxieSA9ICJpZCIpDQpgYGANCg0KYGBge3IgZGFsc3plIHByenlnb3Rvd2FuaWUgemJpb3J1IGRvIGltcG9ydHUgLSBVS0QsIHPFgm93YSBrbHVjem93ZSwgcG9sb25pa2l9DQojd3NrYXphbmllIGludGVyZXN1asSFY3ljaCBQQkwgZHppZWR6aW4gd2llZHp5IHBvIFVLRCBpIG9rcmXFm2xlbmllIHR5cHUgVUtEDQpibl9rcyA8LSBibl9rcyAlPiUNCiAgbXV0YXRlKGR6aWVkemluYV9QQkwgPSBpZmVsc2Uoc3RyX2RldGVjdChYMDgwLCIoPzw9XFwkYXw6fFxcW3xcXCt8XFwoKSg4MikiKSwidWtkX2xpdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KFgwODAsIig/PD1cXCRhfDp8XFxbfFxcKykoNzkxKSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8OikoNzkyKSIpfHN0cl9kZXRlY3QoWDA4MCwiXFwkYTdcXC4wOSIpLCJ1a2RfdGZydHYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGEwMSkoXFwofFxcL3wyfDR8NXw5KSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8XFxbXSkoMDUwKSIpLCJ1a2RfYmlibGlvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChYMDgwLCJcXCRhMDAyIil8c3RyX2RldGVjdChYMDgwLCIoPzw9XFwkYXw6KSgzMDUpIil8c3RyX2RldGVjdChYMDgwLCIoPzw9XFwkYTM5fDozOSkoXFwoNDM4XFwpfDhcXC4yKSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8OikoOTI5W15cXC5dMDUxKSIpLCJ1a2RfcG9ncmFuaWN6ZSIsImJlel91a2RfUEJMIikpKSkpDQojd3NrYXphbmllIGludGVyZXN1asSFY3ljaCBQQkwgcmVrb3Jkw7N3IGJleiBVS0QsIGt0w7NyZSBzxIUgdyBrbHVjenUgUEJMDQpiZXpfdWtkX2FsZV9QQkwgPC0gYm5fa3MgJT4lDQogIHNlbGVjdChpZCwgWDA4MCwgWDY1MCwgWDY1NSwgb3NvYmFfYm5fYXV0b3IsIG9zb2JhX2JuX3RlbWF0LCBkemllZHppbmFfUEJMKSAlPiUNCiAgZmlsdGVyKGR6aWVkemluYV9QQkwgPT0gImJlel91a2RfUEJMIiZYMDgwPT0iIiZpcy5uYShvc29iYV9ibl9hdXRvcikmaXMubmEob3NvYmFfYm5fdGVtYXQpKSAlPiUNCiAgbXV0YXRlKGJlel91a2RfYWxlX1BCTCA9IGdyZXBsKCJsaXRlcmF0fGxpdGVyYWN8cGlzYXJ8YmFqa3xkcmFtYXR8ZXBpZ3JhbWF0fGVzZWp8ZmVsaWV0b258ZmlsbXxrb21lZGl8bm93ZWx8b3Bvd2lhZGFuaXxwYW1pxJl0bmlrfHBvZW1pa3N8cG9lemp8cG93aWXFm8SHfHByb3phfHJlcG9ydGHFvHxzYXR5cnx3c3BvbW5pZW5pfFNjZW5hcml1c3plIHphasSZxId8UG9kcsSZY3puaWtpIGRsYSBnaW1uYXpqw7N3fHRlYXRyfE5hZ3JvZHxhZm9yeXptfGJhxZvFhHxiYcWbbmllfHBvbG9uaWpufGRpYWxvZ2l8ZmFudGFzdHlrYSBuYXVrb3dhfGxlZ2VuZHxwaWXFm8WEfHBvZW1hdHxwcnp5cG93aWXFm3xob25vcmlzIGNhdXNhfGZpbG9sb2dpfGtpbm8gcG9sc2tpZXxwaWXFm25pIixYNjUwLCBpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJsaXRlcmF0fGxpdGVyYWN8cGlzYXJ8YmFqa3xkcmFtYXR8ZXBpZ3JhbWF0fGVzZWp8ZmVsaWV0b258ZmlsbXxrb21lZGl8bm93ZWx8b3Bvd2lhZGFuaXxwYW1pxJl0bmlrfHBvZW1pa3N8cG9lemp8cG93aWXFm8SHfHByb3phfHJlcG9ydGHFvHxzYXR5cnx3c3BvbW5pZW5pfFNjZW5hcml1c3plIHphasSZxId8UG9kcsSZY3puaWtpIGRsYSBnaW1uYXpqw7N3fHRlYXRyfE5hZ3JvZHxhZm9yeXptfGJhxZvFhHxiYcWbbmllfHBvbG9uaWpufGRpYWxvZ2l8ZmFudGFzdHlrYSBuYXVrb3dhfGxlZ2VuZHxwaWXFm8WEfHBvZW1hdHxwcnp5cG93aWXFm3xob25vcmlzIGNhdXNhfGZpbG9sb2dpfGtpbm8gcG9sc2tpZXxwaWXFm25pIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBmaWx0ZXIoYmV6X3VrZF9hbGVfUEJMID09IFRSVUUpICU+JQ0KICBzZWxlY3QoaWQpICU+JQ0KICBtdXRhdGUoYmV6X3VrZF9hbGVfUEJMID0gInRhayIpDQoNCmJuX2tzIDwtIGJuX2tzICU+JQ0KICBmdWxsX2pvaW4oLixiZXpfdWtkX2FsZV9QQkwsYnkgPSAiaWQiKQ0KDQojd3Nwb21uaWVuaWEscGFtacSZdG5pa2ksbGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phLHJlcG9ydGHFvA0Kd3Nwb21uaWVuaWEgPC0gYm5fa3MgJT4lDQogIG11dGF0ZShjenlfd3Nwb21uaWVuaWFfcmVwb3J0YXogPSBpZmVsc2Uoc3RyX2RldGVjdChYNjU1LCJQYW1pxJl0bmlraSBpIHdzcG9tbmllbmlhIil8c3RyX2RldGVjdChYNjU1LCJMaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiKXxzdHJfZGV0ZWN0KFg2NTUsIlBhbWnEmXRuaWtpIil8c3RyX2RldGVjdChYNjU1LCJSZXBvcnRhxbwiKSwidGFrIixOQSkpICU+JQ0KICBzZWxlY3QoaWQsY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6KSAlPiUNCiAgdW5pcXVlKCkNCmJuX2tzIDwtIGJuX2tzICU+JQ0KICBmdWxsX2pvaW4oLix3c3BvbW5pZW5pYSxieSA9ICJpZCIpDQoNCiNzxYJvd2EgbGl0ZXJhY2tpZSB3IHBvbHUgMjQ1DQpyZWtvcmR5X3Nsb3dhIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICBmcm9tIGJuX2tzIGENCiAgICAgICAgICAgICAgICAgICAgd2hlcmUgTE9XRVIoYS5YMjQ1KSBsaWtlICgnJSd8fCdwaXNhcid8fCclJykNCiAgICAgICAgICAgICAgICAgICBvciBMT1dFUihhLlgyNDUpIGxpa2UgKCclJ3x8J2xpdGVyYXQnfHwnJScpDQogICAgICAgICAgICAgICAgICAgb3IgTE9XRVIoYS5YMjQ1KSBsaWtlICgnJSd8fCdsaXRlcmFjJ3x8JyUnKQ0KICAgICAgICAgICAgICAgICAgIG9yIExPV0VSKGEuWDI0NSkgbGlrZSAoJyUnfHwndGVhdHInfHwnJScpDQogICAgICAgICAgICAgICAgICAgb3IgTE9XRVIoYS5YMjQ1KSBsaWtlICgnJSd8fCdmaWxtJ3x8JyUnKQ0KICAgICAgICAgICAgICAgICAgIG9yIExPV0VSKGEuWDI0NSkgbGlrZSAoJyUnfHwnZHJhbWF0J3x8JyUnKSIpICU+JQ0KICBzZWxlY3QoaWQpICU+JQ0KICBtdXRhdGUoc2xvd2FfbGl0ZXJhY2tpZSA9ICJ0YWsiKSAlPiUNCiAgdW5pcXVlKCkNCmJuX2tzIDwtIGJuX2tzICU+JQ0KICBmdWxsX2pvaW4oLixyZWtvcmR5X3Nsb3dhLGJ5ID0gImlkIikNCg0KYm5fb2sgPC0gYm5fa3MgJT4lDQogIGZpbHRlcighKChpcy5uYShvc29iYV9ibl9hdXRvcikmaXMubmEob3NvYmFfYm5fdGVtYXQpKSZkemllZHppbmFfUEJMPT0iYmV6X3VrZF9QQkwiJmlzLm5hKGJlel91a2RfYWxlX1BCTCkmaXMubmEoY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6KSZpcy5uYShzbG93YV9saXRlcmFja2llKSkpDQoNCiNjenkgdHUgdXN1bsSFxIcgemR1Ymxvd2FuZSBpc2JueT8NCiMwMjANCm1hcmNfZmllbGRfMDIwIDwtIGJuX29rICU+JQ0KICBzZWxlY3QoaWQsWDAyMCklPiUNCiAgZmlsdGVyKFgwMjAhPSIiKSAlPiUNCiAgbXV0YXRlKFgwMjA9c3RyX3JlcGxhY2VfYWxsKFgwMjAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDAyMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMDIwIT0iIikgJT4lDQogIG11dGF0ZShYMDIwPXN0cl9yZW1vdmVfYWxsKFgwMjAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDAyMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9vayRYMDIwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDIwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzAyMDwtY2JpbmQobWFyY19maWVsZF8wMjAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wMjAkWDAyMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzAyMCRYMDIwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzAyMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzAyMCRYMDIwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wMjAkWDAyMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8wMjAgPC0gbWFyY19maWVsZF8wMjAgJT4lDQogIHNlbGVjdChpZCxpc2JuPWAkYWApDQoNCmRpc3RhbmNlMSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKCFncmVwbCgiXFwkbiIsWDI0NSkpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzAyMCxieT0iaWQiKSAlPiUNCiAgbXV0YXRlKHBvcm93bmFuaWUgPSBwYXN0ZShpc2JuLHN1YnN0cihzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKFgyNDUsICJcXFciLCAiIikpLDQsMTQpLHN0cl9leHRyYWN0KFgzMDAsIig/PD1cXCRhKSguKj8pKD89LHwgKSIpLHNlcCA9ICJ8IikpDQoNCmNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGlzdGFuY2UxJHBvcm93bmFuaWUpKQ0KDQpkaXN0YW5jZTEgPC0gbWVyZ2UoZGlzdGFuY2UxLGNvdW50LGJ5LnggPSAicG9yb3duYW5pZSIsYnkueSA9ICJWYXIxIixhbGwueCA9IFRSVUUpICU+JQ0KICBzZWxlY3QocG9yb3duYW5pZSxGcmVxLDI6MTU1KSAlPiUNCiAgYXJyYW5nZSgtRnJlcSxwb3Jvd25hbmllKSAlPiUNCiAgc2VsZWN0KHBvcm93bmFuaWUsRnJlcSxpZCkgJT4lDQogIGNTcGxpdCguLCJwb3Jvd25hbmllIixzZXAgPSAifCIsZGlyZWN0aW9uID0gIndpZGUiKQ0KDQojcG9zenVrYW5pZSBkeXN0YW5zdSBMZXZlbnNodGVpbmEgPT0gMSBwcnp5IHRha2ltIHNhbXltIElTQk4NCg0KZGlzdGFuY2UyIDwtIGRpc3RhbmNlMSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwb3Jvd25hbmllXzEpKSAlPiUNCiAgZ3JvdXBfYnkocG9yb3duYW5pZV8xKSAlPiUNCiAgbXV0YXRlKEZyZXEgPSBwYXN0ZShGcmVxLGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIGlkID0gcGFzdGUoaWQsY29sbGFwc2UgPSAifCIpLA0KICAgICAgICAgcG9yb3duYW5pZV8yID0gcGFzdGUocG9yb3duYW5pZV8yLGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIHBvcm93bmFuaWVfMyA9IHBhc3RlKHBvcm93bmFuaWVfMyxjb2xsYXBzZSA9ICJ8IikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoaWxlID0gc3RyX2NvdW50KHBvcm93bmFuaWVfMiwiXFx8IikrMSkgJT4lDQogIGFycmFuZ2UoLWlsZSkgJT4lDQogIG11dGF0ZShpZF9ncnVweSA9IDE6bGVuZ3RocyguKSkgJT4lDQogIGZpbHRlcihpbGU+MSkgJT4lDQogIGNTcGxpdCguLGMoIkZyZXEiLCJpZCIsInBvcm93bmFuaWVfMiIsInBvcm93bmFuaWVfMyIpLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShpZCkpDQoNCnBlcm11dGF0aW9ucyA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCnggPC0gMTptYXgoZGlzdGFuY2UyJGlkX2dydXB5KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBkaXN0YW5jZTMgPC0gYXMudmVjdG9yKHVubGlzdChkaXN0YW5jZTIgJT4lIGZpbHRlcihpZF9ncnVweT09aSkgJT4lIHNlbGVjdChwb3Jvd25hbmllXzIpKSkNCiAgaXRlcmF0aW9uIDwtIGFzLmRhdGEuZnJhbWUocGVybXV0YXRpb25zKGRpc3RhbmNlMywyKSkgJT4lDQogICAgbXV0YXRlKGlkX2dydXB5ID0gaSkNCiAgeSA8LSAxOmxlbmd0aChpdGVyYXRpb24kVjEpDQogIGZvciAoaiBpbiB5KSB7DQogICAgcHJvZ3Jlc3MobWF0Y2goaix5KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHkpKQ0KICAgIGl0ZXJhdGlvbiRkaXN0YW5jZVtqXSA8LSBhZGlzdChpdGVyYXRpb24kVjFbal0saXRlcmF0aW9uJFYyW2pdKQ0KICB9DQogIHBlcm11dGF0aW9ucyA8LSByYmluZChwZXJtdXRhdGlvbnMsaXRlcmF0aW9uKQ0KfQ0KDQpwZXJtdXRhdGlvbnMgPC0gcGVybXV0YXRpb25zICU+JQ0KICBmaWx0ZXIoZGlzdGFuY2U9PTEpDQoNCmRpc3RhbmNlMiA8LSBkaXN0YW5jZTIgJT4lDQogIGZpbHRlcihpZF9ncnVweSAlaW4lIHBlcm11dGF0aW9ucyRpZF9ncnVweSkgJT4lDQogIHNlbGVjdChpZCxpZF9ncnVweSkNCiNwb8WCxIVjennEhyBkaXN0YW5jZTIgeiBkaXN0YW5jZTEsIMW8ZWJ5IHd5ZG9iecSHIHBlxYJuxIUgbGlzdMSZIHpkdWJsb3dhbnljaCBrc2nEhcW8ZWsNCmR1YmxlX2tzaWF6ZWsgPC0gZGlzdGFuY2UxICU+JQ0KICB1bml0ZSgicG9yb3duYW5pZSIsIHBvcm93bmFuaWVfMTpwb3Jvd25hbmllXzMsIHNlcCA9ICJ8IikgJT4lDQogIGZpbHRlcihGcmVxPjEpICU+JQ0KICBmdWxsX2pvaW4oLixkaXN0YW5jZTIsYnk9ImlkIikNCg0KZHVibGVfa3NpYXplayRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChkdWJsZV9rc2lhemVrJHBvcm93bmFuaWUpKQ0KDQpkdWJsZV9rc2lhemVrIDwtIGR1YmxlX2tzaWF6ZWsgJT4lDQogIGFycmFuZ2UoaWRfZ3J1cHksc2FtZSkgJT4lDQogIG11dGF0ZShpZF9ncnVweV9kdWJsaSA9IGlmZWxzZSghaXMubmEoaWRfZ3J1cHkpLGFzLmNoYXJhY3RlcihpZF9ncnVweSkscGFzdGUoIngiLHNhbWUsc2VwID0gIiIpKSkgJT4lDQogIHNlbGVjdChpZCxpZF9ncnVweV9kdWJsaSkgJT4lDQogIGFycmFuZ2UoaWRfZ3J1cHlfZHVibGkpDQoNCmR1YmxlX2tzaWF6ZWskaWRfZ3J1cHlfZHVibGkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGR1YmxlX2tzaWF6ZWskaWRfZ3J1cHlfZHVibGkpKQ0KI3V6dXBlxYJuaWVuaWUgY2HFgmVnbyB6YmlvcnUgbyBpbmZvcm1hY2rEmSBvIGR1Ymx1LCB3eWRvYnljaWUgZHVibGkgZG8gb3NvYm5lZ28gcGxpa3UgaSB1c3VuaWVjaWUgaWNoIHogZ8WCw7N3bmVnbyBwbGlrdSB6IHJla29yZGFtaSBibjsgd3NrYXphbmllIGxpc3R5IGludGVyZXN1asSFY3ljaCBww7NsDQpibl9vayA8LSBibl9vayAlPiUNCiAgbGVmdF9qb2luKC4sZHVibGVfa3NpYXplayxieT0iaWQiKSAlPiUNCiAgc2VsZWN0KGlkLCBYMDA4LCBYMDA5LCBYMDE1LCBYMDQxLCBYMDQ0LCBYMDgwLCBYMTAwLCBYMjQ1LCBYMjQ2LCBYMjUwLCBYMjYwLCBYMzAwLCBYMzgwLCBYMzg2LCBYNDkwLCBYNTAwLCBYNTAxLCBYNTQ2LCBYNjAwLCBYNjUwLCBYNjU1LCBYNzAwLCBYNzEwLCBYODAwLCBYODMwLCByb2ssIEJOX1VSTCwgb3NvYmFfYm5fYXV0b3IsIG9zb2JhX2JuX3RlbWF0LCBkemllZHppbmFfUEJMLCBiZXpfdWtkX2FsZV9QQkwsIGN6eV93c3BvbW5pZW5pYV9yZXBvcnRheiwgc2xvd2FfbGl0ZXJhY2tpZSwgaWRfZ3J1cHlfZHVibGkpDQoNCmR1YmxlX2tzaWF6ZWsgPC0gYm5fb2sgJT4lDQogIGZpbHRlcighaXMubmEoaWRfZ3J1cHlfZHVibGkpKSAlPiUNCiAgYXJyYW5nZShpZF9ncnVweV9kdWJsaSkNCg0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihpcy5uYShpZF9ncnVweV9kdWJsaSkpDQojd3Bpc2FuaWUgdyB6ZHVibG93YW5lIHJla29yZHkgamFrIG5handpxJlrc3plaiBpbG/Fm2NpIGRhbnljaCAoc3VtYSB3c3p5c3RraWNoIGR1YmxpKQ0KZHVibGVfa3NpYXplayA8LSBkdWJsZV9rc2lhemVrICU+JQ0KICBhcnJhbmdlKGlkX2dydXB5X2R1YmxpLC1uY2hhcihYMDE1KSkNCmR1YmxlX2tzaWF6ZWtbaXMubmEoZHVibGVfa3NpYXplayldIDwtICIiDQpkdWJsZV9uYXByYXdpb25lIDwtIGRhdGEuZnJhbWUoc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KeCA8LSAxOm1heChkdWJsZV9rc2lhemVrJGlkX2dydXB5X2R1YmxpKQ0KeSA8LSBjKDQ6MjcsMjk6MzQpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGl0ZXJhdGlvbiA8LSBkdWJsZV9rc2lhemVrICU+JQ0KICAgIGZpbHRlcihpZF9ncnVweV9kdWJsaT09aSkNCiAgZm9yIChqIGluIHkpIHsNCiAgICBpZiAoaj09MzApIHsNCiAgICAgIGl0ZXJhdGlvblssal0gPC0gaXRlcmF0aW9uWyxqXVtuY2hhcihpdGVyYXRpb25bLGpdKT09bWluKG5jaGFyKGl0ZXJhdGlvblssal0pKV1bMV0NCiAgICB9IGVsc2Ugew0KICAgICAgICBpdGVyYXRpb25bLGpdIDwtIGl0ZXJhdGlvblssal1bbmNoYXIoaXRlcmF0aW9uWyxqXSk9PW1heChuY2hhcihpdGVyYXRpb25bLGpdKSldWzFdDQogICAgICB9DQogIH0NCiAgZHVibGVfbmFwcmF3aW9uZSA8LSByYmluZChkdWJsZV9uYXByYXdpb25lLGl0ZXJhdGlvbikNCn0NCiNwb3pvc3Rhd2llbmllIHBvamVkeW5jenljaCB3aWVyc3p5IGRsYSBrc2nEhcW8ZWsNCmR1YmxlX25hcHJhd2lvbmUgPC0gZHVibGVfbmFwcmF3aW9uZVshZHVwbGljYXRlZChkdWJsZV9uYXByYXdpb25lJGlkX2dydXB5X2R1YmxpKSxdDQpkdWJsZV9uYXByYXdpb25lIDwtIGR1YmxlX25hcHJhd2lvbmUgJT4lDQogIG11dGF0ZShvc29iYV9ibl9hdXRvciA9IGlmZWxzZShvc29iYV9ibl9hdXRvciE9IiIsYXMuY2hhcmFjdGVyKG9zb2JhX2JuX2F1dG9yKSxOQSksDQogICAgICAgICBvc29iYV9ibl90ZW1hdCA9IGlmZWxzZShvc29iYV9ibl90ZW1hdCE9IiIsYXMuY2hhcmFjdGVyKG9zb2JhX2JuX3RlbWF0KSxOQSksDQogICAgICAgICBkemllZHppbmFfUEJMID0gaWZlbHNlKGR6aWVkemluYV9QQkwhPSIiLGFzLmNoYXJhY3RlcihkemllZHppbmFfUEJMKSxOQSksDQogICAgICAgICBiZXpfdWtkX2FsZV9QQkwgPSBpZmVsc2UoYmV6X3VrZF9hbGVfUEJMIT0iIixhcy5jaGFyYWN0ZXIoYmV6X3VrZF9hbGVfUEJMKSxOQSksDQogICAgICAgICBjenlfd3Nwb21uaWVuaWFfcmVwb3J0YXogPSBpZmVsc2UoY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6IT0iIixhcy5jaGFyYWN0ZXIoY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6KSxOQSksDQogICAgICAgICBzbG93YV9saXRlcmFja2llID0gaWZlbHNlKHNsb3dhX2xpdGVyYWNraWUhPSIiLGFzLmNoYXJhY3RlcihzbG93YV9saXRlcmFja2llKSxOQSksKQ0KI3BvxYLEhWN6ZW5pZSB1bmlrYXRvd3ljaCBrc2nEhcW8ZWsgeiBkdWJsaSB6IGNhxYJ5bSB6YmlvcmVtDQpibl9vayA8LSBibl9vayAlPiUNCiAgYmluZF9yb3dzKC4sZHVibGVfbmFwcmF3aW9uZSkgJT4lDQogIHNlbGVjdCgtaWRfZ3J1cHlfZHVibGkpDQoNCiN1c3VuacSZY2llIHphZ3Jhbmljem55Y2ggemFwaXPDs3csIGt0w7NyZSBuaWUgc8SFIHBvbG9uaWthbWkgDQojbmEgcG9kc3Rhd2llIGJyYWt1IHd5c3TEhXBpZcWEIGZyYXp5ICJwb2wiIHcgcG9sYWNoIE1BUkMNCm5pZV9wb2xvbmlraSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKGlmIChYNTAxPT0iIikgIWdyZXBsKCJwbCIsc3Vic3RyKFgwMDgsMTYsMTgpKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoInBvbCIsc3Vic3RyKFgwMDgsMzYsMzgpKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoInBvbCIsWDA0MSkpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJwbCIsWDA0NCkpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJwb2wiLFg1MDAsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoInBvbCIsWDUwMSxpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgicG9sIixYNTQ2LGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBzZWxlY3QoaWQpICU+JQ0KICBtdXRhdGUoY3p5X3BvbG9uaWsgPSAibmllIikgJT4lDQogIHVuaXF1ZSgpDQoNCiNuYSBwb3N0YXdpZSB3eXN0xIVwaWXFhCB0d8OzcmPDs3cgcGJsIHcgcG9sYWNoIHV3YWcNCiNjenkgd2FydG8/IGNvIHpyb2JpxIcgeiBjYXNlIGluc2Vuc2l0aXZlbmVzPyAtLT4gemEgZHXFvG8gxZttaWVjaSB3cGFkYSwgenJlenlnbm93YcWCZW0geiB0ZWdvDQoNCmJuX29rIDwtIGJuX29rICU+JQ0KICBmdWxsX2pvaW4oLixuaWVfcG9sb25pa2ksYnkgPSAiaWQiKSAlPiUNCiAgc2VsZWN0KGlkLCBYMDA4LCBYMDA5LCBYMDQxLCBYMDQ0LCBYMDgwLCBYMTAwLCBYMjQ1LCBYMjQ2LCBYMjUwLCBYMjYwLCBYMzAwLCBYMzgwLCBYMzg2LCBYNDkwLCBYNTAwLCBYNTAxLCBYNTAwLCBYNTQ2LCBYNjAwLCBYNjUwLCBYNjU1LCBYNzAwLCBYNzEwLCBYODAwLCBYODMwLCByb2ssIEJOX1VSTCwgb3NvYmFfYm5fYXV0b3IsIG9zb2JhX2JuX3RlbWF0LCBkemllZHppbmFfUEJMLCBiZXpfdWtkX2FsZV9QQkwsIGN6eV93c3BvbW5pZW5pYV9yZXBvcnRheiwgc2xvd2FfbGl0ZXJhY2tpZSwgY3p5X3BvbG9uaWspICU+JQ0KICB1bmlxdWUoKQ0KI3dza2F6YW5pZSBuaWVwb2xvbmlrw7N3IGkgdXN1bmnEmWNpZSB6ZSB6YmlvcnUNCm5pZV9wb2xvbmlraSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKGN6eV9wb2xvbmlrPT0ibmllIikgJT4lDQogIGZpbHRlcihpcy5uYShvc29iYV9ibl9hdXRvcil8aXMubmEob3NvYmFfYm5fdGVtYXQpfCEob3NvYmFfYm5fYXV0b3IgJWluJSBjKCIxNDh8SGFzxYJhIG9zb2Jvd2UgKGxpdGVyYXR1cmEgcG9sc2thKSIsIjQzMHxIYXPFgmEgb3NvYm93ZSAoTHVkemllIHRlYXRydSBpIGZpbG11KSIpKXwhKG9zb2JhX2JuX3RlbWF0ICVpbiUgYygiMTQ4fEhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkiLCI0MzB8SGFzxYJhIG9zb2Jvd2UgKEx1ZHppZSB0ZWF0cnUgaSBmaWxtdSkiKSkpDQpibl9vayA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgIGZyb20gYm5fb2sgYQ0KICAgICAgICAgICAgICAgd2hlcmUgYS5pZCBub3QgaW4gKHNlbGVjdCBiLmlkIGZyb20gbmllX3BvbG9uaWtpIGIpIikgJT4lDQogIHNlbGVjdCgtY3p5X3BvbG9uaWspDQpgYGANCg0KYGBge3IgYXV0b21hdHljem5lIHVzdW5pxJljaWUgSU5PIG5hIHBvZHN0YXdpZSB3Y3plxZtuaWVqc3p5Y2ggaW1wb3J0w7N3fQ0KI3BvYnJhbmllIHN0YXJ5Y2ggbGlzdCBrc2nEhcW8ZWsgeiBpbXBvcnR1DQpsaXN0eV8yMDA1IDwtIHNoZWV0c19yZWFkKHNzID0gIjFIa1drWDYxc1FXa3RTWGYwdjB1UFY4ajJEd3VUb2Nlc3lDSnVLVGRpc0lVIiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA2IDwtIHNoZWV0c19yZWFkKHNzID0gIjF6ZU14X0lkc3VtOEptbE02RzdFdWZ4OUx4bG9Ib0FIdjhWLU15NzFWWmY0Iiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA3IDwtIHNoZWV0c19yZWFkKHNzID0gIjE5aUw3WW9EOHVnLXJMbnB6UzZGRDQ2YVMySjFCUmY0cUw1VnhsbHl3Q0dFIiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA4IDwtIHNoZWV0c19yZWFkKHNzID0gIjFSc2hUZVdkWEJFN096T0Vmb0dwTDlMamJfR1hEbEdEZVBOalYxSEttdU9vIiwgc2hlZXQgPSAibGlzdGFfa3NpYXplayIpDQpsaXN0eV8yMDA0IDwtIHNoZWV0c19yZWFkKHNzID0gIjFSbURpYTk3czRCOEY3NHNTN1dicG52X0E5ek1mcjR4VHZjRDlsZXVrQWZNIiwgc2hlZXQgPSAibGlzdGFfa3NpxIXFvGVrIikgJT4lDQogIG11dGF0ZSh0eXBfa3NpYXpraSA9IE5BLCBsaW5rID0gTkEsIGxpbmtfMSA9IE5BLCBzdGF0dXMgPSBOQSwgYmxhZF93X2ltcG9yY2llX3R5dHVsdSA9IE5BKSAlPiUNCiAgc2VsZWN0KHByYWNvd25payxaQV9aQVBJU19JRCx0eXBfa3NpYXpraSwgbGluaywgbGlua18xLCByb2ssIHN0YXR1cywgYmxhZF93X2ltcG9yY2llX3R5dHVsdSwgWDEwMCwgWDI0NSwgWDY1MCwgWDY1NSwgWDI0NiwgWDI1MCwgWDI2MCwgWDMwMCwgWDM4MCwgWDQ5MCwgWDUwMCwgWDUwMSwgWDU0NiwgWDYwMCwgWDcwMCwgWDA0MSwgWDA4MCkNCiN1amVkbm9saWNlbmllIDIwMDQgZG8gd3pvcnUgcMOzxbpuaWVqc3p5Y2ggcm9jem5pa8OzVw0KZG8yMDA0IDwtIFJKREJDOjpkYkdldFF1ZXJ5KFBCTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHouemFfemFwaXNfaWQsIHouemFfc3RhdHVzX2ltcA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGJsX3phcGlzeSB6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgei56YV91d2FnaSBsaWtlICclaW1wb3J0JTAyJSciKQ0KbGlzdHlfMjAwNCA8LSBtZXJnZShsaXN0eV8yMDA0LGRvMjAwNCxieSA9ICJaQV9aQVBJU19JRCIsYWxsLnggPSBUUlVFKSAlPiUNCiAgbXV0YXRlKHN0YXR1cyA9IFpBX1NUQVRVU19JTVApICU+JQ0KICBzZWxlY3QoLVpBX1NUQVRVU19JTVApICU+JQ0KICBzZWxlY3QocHJhY293bmlrLFpBX1pBUElTX0lELHR5cF9rc2lhemtpLCBsaW5rLCBsaW5rXzEsIHJvaywgc3RhdHVzLCBibGFkX3dfaW1wb3JjaWVfdHl0dWx1LCBYMTAwLCBYMjQ1LCBYNjUwLCBYNjU1LCBYMjQ2LCBYMjUwLCBYMjYwLCBYMzAwLCBYMzgwLCBYNDkwLCBYNTAwLCBYNTAxLCBYNTQ2LCBYNjAwLCBYNzAwLCBYMDQxLCBYMDgwKQ0KI3phcGV3bmllbmllIHR5Y2ggc2FteWNoIG5hencga29sdW1uDQpjb2xuYW1lcyhsaXN0eV8yMDA1KSA8LSBuYW1lcyhsaXN0eV8yMDA0KQ0KY29sbmFtZXMobGlzdHlfMjAwNikgPC0gbmFtZXMobGlzdHlfMjAwNCkNCmNvbG5hbWVzKGxpc3R5XzIwMDcpIDwtIG5hbWVzKGxpc3R5XzIwMDQpDQpjb2xuYW1lcyhsaXN0eV8yMDA4KSA8LSBuYW1lcyhsaXN0eV8yMDA0KQ0KbGlzdHlfMjAwNCA8LSBsaXN0eV8yMDA0ICU+JQ0KICBtdXRhdGUoWDY1NSA9IHN0cl9yZW1vdmUoc3RyX3JlcGxhY2VfYWxsKFg2NTUsIihcXCRhKSIsInxcXDEiKSwiXlxcfCIpLA0KICAgICAgICAgWDY1MCA9IHN0cl9yZW1vdmUoc3RyX3JlcGxhY2VfYWxsKFg2NTAsIihcXCRhKSIsInxcXDEiKSwiXlxcfCIpKQ0KDQojd3l6bmFjemVuaWUgbGlzdHkgNjUwIGkgNjU1IGRvIGF1dG9tYXR5Y3puZWdvIElOTyBuYSBwb2RzdGF3aWUgd2N6ZcWbbmllanN6eWNoIGltcG9ydMOzdyAtIHVzdW5pxJl0ZSBzxIUgdHlsa28gdGUgZGVza3J5cHRvcnksIGt0w7NyZSBuaWUgbWFqxIUgendpxIV6a3UgeiBsaXRlcmF0dXLEhSBwb2RtaW90b3fEhQ0KemFwaXN5IDwtIFJKREJDOjpkYkdldFF1ZXJ5KFBCTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHouemFfemFwaXNfaWQsIHouemFfc3RhdHVzX2ltcCwgei56YV91d2FnaQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGJsX3phcGlzeSB6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgei56YV91d2FnaSBsaWtlICclaW1wb3J0JSciKSAlPiUNCiAgbXV0YXRlKHByYWNvd25pa19wYmwgPSBzdHJfZXh0cmFjdChaQV9VV0FHSSwgIig/PD1ha2NlcHR1amU6KShbQS1aXSopIikpICU+JQ0KICBzZWxlY3QoWkFfWkFQSVNfSUQscHJhY293bmlrX3BibCxaQV9TVEFUVVNfSU1QKQ0KDQpkb19pbXBvcnR1X05JRSA8LSByYmluZChsaXN0eV8yMDA0LGxpc3R5XzIwMDUsbGlzdHlfMjAwNixsaXN0eV8yMDA3LGxpc3R5XzIwMDgpICU+JQ0KICBmdWxsX2pvaW4oLix6YXBpc3ksYnkgPSAiWkFfWkFQSVNfSUQiKSAlPiUNCiAgc2VsZWN0KFg2NTAsWDY1NSxaQV9TVEFUVVNfSU1QKSAlPiUNCiAgbXV0YXRlKFg2NTAgPSBzdHJfcmVtb3ZlX2FsbChYNjUwLCJcXFxcNyIpLA0KICAgICAgICAgWDY1NSA9IHN0cl9yZW1vdmVfYWxsKFg2NTUsIlxcXFw3IiksDQogICAgICAgICBqb2ludCA9IHBhc3RlKFg2NTAsWDY1NSxzZXAgPSAifiIpKSAlPiUNCiAgc2VsZWN0KFpBX1NUQVRVU19JTVAsam9pbnQpICU+JQ0KICBncm91cF9ieShqb2ludCkgJT4lDQogIG11dGF0ZShncnVwYSA9IHBhc3RlKFpBX1NUQVRVU19JTVAsY29sbGFwc2UgPSAiLCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3Qoam9pbnQsIGdydXBhKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShpbGUgPSBzdHJfY291bnQoZ3J1cGEsIiwiKSsxKSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJJTk8iLGdydXBhKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoIklPS3xJTVB8SVBOfElQQyIsZ3J1cGEpKSAlPiUNCiAgbXV0YXRlKGN6eSA9IHN0cl9kZXRlY3Qoam9pbnQsIlxcJHlbXFxkLV0rIHdcXC4iKSkgJT4lDQogIGZpbHRlcihjenk9PUZBTFNFKSAlPiUNCiAgc2VsZWN0KGpvaW50KSAlPiUNCiAgbXV0YXRlKGpvaW50ID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKGpvaW50LCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpKSAlPiUNCiAgbXV0YXRlKGRvX3d5cnp1Y2VuaWFfbmFfcG9kc3Rhd2llX0lOTyA9ICJ0YWsiKQ0KDQpibl9vayA8LSBibl9vayAlPiUNCiAgbXV0YXRlKFg2NTAgPSBpZmVsc2UoWDY1MD09IiIsTkEsYXMuY2hhcmFjdGVyKFg2NTApKSwNCiAgICAgICAgIFg2NTUgPSBpZmVsc2UoWDY1NT09IiIsTkEsYXMuY2hhcmFjdGVyKFg2NTUpKSwNCiAgICAgICAgIGpvaW50ID0gcGFzdGUoWDY1MCxYNjU1LHNlcCA9ICJ+IikpICU+JQ0KICBsZWZ0X2pvaW4oLixkb19pbXBvcnR1X05JRSxieSA9ICJqb2ludCIpICU+JQ0KICBtdXRhdGUoWDY1MCA9IGlmZWxzZShpcy5uYShYNjUwKSwiIixhcy5jaGFyYWN0ZXIoWDY1MCkpLA0KICAgICAgICAgWDY1NSA9IGlmZWxzZShpcy5uYShYNjU1KSwiIixhcy5jaGFyYWN0ZXIoWDY1NSkpKQ0KDQpkb19pbXBvcnR1X05JRSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKGlzLm5hKG9zb2JhX2JuX2F1dG9yKSZpcy5uYShvc29iYV9ibl90ZW1hdCkmaXMubmEoc2xvd2FfbGl0ZXJhY2tpZSkmZG9fd3lyenVjZW5pYV9uYV9wb2RzdGF3aWVfSU5PPT0idGFrIikgJT4lDQogIGZpbHRlcighZ3JlcGwoImxpdGVyYXR8bGl0ZXJhY3xwYW1pxJl0bmlrfHBpc2FyIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSkpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBkb19pbXBvcnR1X05JRSBiKSIpICU+JQ0KICBzZWxlY3QoLWpvaW50LC1kb193eXJ6dWNlbmlhX25hX3BvZHN0YXdpZV9JTk8pDQoNCiN1c3VuacSZY2llIG5hIHBvZHN0YXdpZSB0YWJlbCBLUA0Kb3V0IDwtIHNoZWV0c19yZWFkKHNzID0gIjFsT19adHd5QkRlUEdxWGtnV3lrX1dtR2VRQmFBUUJ2RVVqTm5jdHJ3LXZnIikgJT4lDQogIGZpbHRlcih3Y2hvZHppX2RvX3BibCA9PSAibmllIikNCg0KS1Bfb3V0IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIld5ZGF3bmljdHdhIHBvcHVsYXJuZSIsWDY1NSkpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZnVsbF9qb2luKC4sb3V0LGJ5ID0gIlg2NTAiKSAlPiUNCiAgZmlsdGVyKHdjaG9kemlfZG9fcGJsPT0ibmllIikgJT4lDQogIGZpbHRlcighaXMubmEoWDY1NSkpICU+JQ0KICBzZWxlY3QoaWQpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBLUF9vdXQgYikiKQ0KDQojY3p5IHByw7Nib3dhxIcgd3lyenVjYcSHIHBvIFVLRCwga3TDs3JlIGRvc3Rhd2HFgm8gdHlsa28gSU5PPw0KZG9faW1wb3J0dV9OSUUyIDwtIHJiaW5kKGxpc3R5XzIwMDQsbGlzdHlfMjAwNSxsaXN0eV8yMDA2LGxpc3R5XzIwMDcsbGlzdHlfMjAwOCkgJT4lDQogIGZ1bGxfam9pbiguLHphcGlzeSxieSA9ICJaQV9aQVBJU19JRCIpICU+JQ0KICBzZWxlY3QoWDA4MCxaQV9TVEFUVVNfSU1QKSAlPiUNCiAgbXV0YXRlKFgwODAgPSBzdHJfcmVtb3ZlX2FsbChYMDgwLCJcXFxcIikpICU+JQ0KICBzZWxlY3QoWkFfU1RBVFVTX0lNUCxYMDgwKSAlPiUNCiAgZ3JvdXBfYnkoWDA4MCkgJT4lDQogIG11dGF0ZShncnVwYSA9IHBhc3RlKFpBX1NUQVRVU19JTVAsY29sbGFwc2UgPSAiLCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoWDA4MCwgZ3J1cGEpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGlsZSA9IHN0cl9jb3VudChncnVwYSwiLCIpKzEpICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIklOTyIsZ3J1cGEpKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgiSU9LfElNUHxJUE58SVBDIixncnVwYSkpICU+JQ0KI3R1IHNpxJkgbXVzaSBLUCB3eXBvd2llZHppZcSHLCBjenkgamFrIGJ5xYJvIDJ4TklFIHRvIHd5c3RhcmN6eSwgxbxlYnkgd3l3YWxhxIcNCiMgIGZpbHRlcihpbGUgPiAxKSAlPiUNCiAgc2VsZWN0KFgwODApICU+JQ0KICBtdXRhdGUoWDA4MCA9IHBhc3RlKCJcXCIsc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFgwODAsIihcXCRhKSIsIlxcXFwjXFwxIiksIiMiKSxzZXAgPSAiIikpICU+JQ0KICBtdXRhdGUoZG9fd3lyenVjZW5pYV9uYV9wb2RzdGF3aWVfSU5PID0gInRhayIpDQoNCiNuYSBwb2RzdGF3aWUgVUtEIHRlxbwgd3lyenVjacSHIC0gZGVjeXpqYSBLUA0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGZ1bGxfam9pbiguLGRvX2ltcG9ydHVfTklFMixieSA9ICJYMDgwIikgJT4lDQogIGZpbHRlcighaXMubmEoaWQpKQ0KDQpkb19pbXBvcnR1X05JRTIgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihpcy5uYShvc29iYV9ibl9hdXRvcikmaXMubmEob3NvYmFfYm5fdGVtYXQpJmlzLm5hKHNsb3dhX2xpdGVyYWNraWUpJmRvX3d5cnp1Y2VuaWFfbmFfcG9kc3Rhd2llX0lOTz09InRhayIpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBkb19pbXBvcnR1X05JRTIgYikiKSAlPiUNCiAgc2VsZWN0KC1kb193eXJ6dWNlbmlhX25hX3BvZHN0YXdpZV9JTk8pDQoNCiNyZXN6dGEgcmVrb3Jkw7N3LCBrdMOzcmUgbmllIGLEmWTEhSB6YWltcG9ydG93YW5lDQpyZXN6dGEgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICBmcm9tIGJuX2tzIGENCiAgICAgICAgICAgICAgIHdoZXJlIGEuaWQgbm90IGluIA0KICAgICAgICAgICAgICAgKHNlbGVjdCBiLmlkDQogICAgICAgICAgICAgICBmcm9tIGJuX29rIGIpIikNCmBgYA0KDQpgYGB7ciBwcnp5cGlzYW5pZSBrc2nEhcW8Y2Ugcm9kemFqdSAocG9kbWlvdG93YSwgcHJ6ZWRtaW90b3dhLCBhbnRvbG9naWUsIHdzcMOzxYJ3eWRhbmllKX0NCmJuX29rIDwtIGJuX29rICU+JQ0KICBtdXRhdGUoY3p5X21hX3VrZCA9IGlmZWxzZShYMDgwPT0iIiwibmllIiwidGFrIiksDQogICAgICAgICBwb3NpdGlvbl9kYXNoID0gaWZlbHNlKGdyZXBsKCIoXFxcXFxcXFxcXCRhfDopKDgyMVxcLikiLFgwODApLHN0cl9sb2NhdGUoWDA4MCwiXFwtIilbLDFdLCBOQSksDQogICAgICAgICBwb3NpdGlvbl9kYXNoID0gaWZlbHNlKGlzLm5hKHBvc2l0aW9uX2Rhc2gpLCIiLGFzLmludGVnZXIocG9zaXRpb25fZGFzaCkpLA0KICAgICAgICAgcG9zaXRpb25fMDkxID0gc3RyX2xvY2F0ZShYMDgwLCJcXCgwOTFcXCkiKVssMV0sDQogICAgICAgICBwb3NpdGlvbl8wOTEgPSBpZmVsc2UoaXMubmEocG9zaXRpb25fMDkxKSwiIixhcy5pbnRlZ2VyKHBvc2l0aW9uXzA5MSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoZ3JlcGwoIkFudG9sb2dpIixYNjU1KSwiYW50b2xvZ2lhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwb3NpdGlvbl8wOTEhPSIiJnBvc2l0aW9uX2Rhc2ghPSIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMuaW50ZWdlcihwb3NpdGlvbl8wOTEpPGFzLmludGVnZXIocG9zaXRpb25fZGFzaCksICJwcnplZG1pb3Rvd2EiLCAicG9kbWlvdG93YSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocG9zaXRpb25fZGFzaCE9IiIsInBvZG1pb3Rvd2EiLCJwcnplZG1pb3Rvd2EiKSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoY3p5X21hX3VrZD09Im5pZSIsIiIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSkpDQpnYXR1bmtpX3BvZG1pb3Rvd2UgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgc2VsZWN0KFg2NTUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoWDY1NSwiXFwkeVtcXGQtXSsgd1xcLiIpKQ0KZ2F0dW5raV9wb2RtaW90b3dlIDwtIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwocGFzdGUoZ2F0dW5raV9wb2RtaW90b3dlJFg2NTUsY29sbGFwc2UgPSAifCIpLCIoLnsyfSkoXFwkYSkiLCJcXDIiKSwiXFwkIiwiXFxcXCQiKQ0KYm5fb2skY3p5X3BvZG1pb3Rvd3kgPC0gZ3JlcGwoZ2F0dW5raV9wb2RtaW90b3dlLGJuX29rJFg2NTUpfGdyZXBsKGdhdHVua2lfcG9kbWlvdG93ZSxibl9vayRYNjUwKQ0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIG11dGF0ZShyb2R6YWpfa3NpYXpraSA9IGlmZWxzZShzdHJfY291bnQoWDI0NSwgIiAvICIpKzE+MiwiYW50b2xvZ2lhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoWDI0NSwgIiAvICIpKzE9PTIsIndzcMOzxYJ3eWRhbmllIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uocm9kemFqX2tzaWF6a2k9PSIiJmN6eV9wb2RtaW90b3d5PT1UUlVFJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjUwKSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1NSksInBvZG1pb3Rvd2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDEwMCE9IiImZ3JlcGwoImFQYW1pxJl0bmlrfGFMaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLFg2NTUpJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjUwKSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1NSksInBvZG1pb3Rvd2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFgxMDAhPSIiJmdyZXBsKCJhUmVwb3J0YcW8IixYNjU1KSZncmVwbCgiXFwkeSIsWDY1NSkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFgxMDAhPSIiJihYNjU1PT0iXFw3JGFSZXBvcnRhxbwgcG9sc2tpJDJEQk4ifFg2NTU9PSJcXDckYVJlcG9ydGHFvCQyREJOIikmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyb2R6YWpfa3NpYXpraT09IiImY3p5X3BvZG1pb3Rvd3k9PUZBTFNFLCJwcnplZG1pb3Rvd2EiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpKSkpKSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2Uocm9kemFqX2tzaWF6a2k9PSIiLCJwcnplZG1pb3Rvd2EiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoZ3JlcGwoIkxla3R1cnkgV3N6ZWNoIEN6YXPDs3cgOiBzdHJlc3pjemVuaWUsIGFuYWxpemEsIGludGVycHJldGFjamF8TGVrdHVyeSBXc3plY2ggQ3phc8OzdyAtIExpdGVyYXR8QmlibGlvdGVjemthIE9wcmFjb3dhxYQiLFg0OTApfGdyZXBsKCJMZWt0dXJ5IFdzemVjaCBDemFzw7N3IDogc3RyZXN6Y3plbmllLCBhbmFsaXphLCBpbnRlcnByZXRhY2phfExla3R1cnkgV3N6ZWNoIEN6YXPDs3cgLSBMaXRlcmF0fEJpYmxpb3RlY3prYSBPcHJhY293YcWEIixYODMwKSwicHJ6ZWRtaW90b3dhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIGlsdV90d29yY293ID0gc3RyX2NvdW50KFgxMDAsIlxcJGEiKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKGlsdV90d29yY293PjQmcm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIiwiYW50b2xvZ2lhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKGdyZXBsKCJMZWdlbmR5IixYNjU1KSwiYW50b2xvZ2lhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSkgJT4lDQogIHNlbGVjdCgxOjMwLHJvZHphal9rc2lhemtpKQ0KYGBgDQoNCmBgYHtyIHd5em5hY3plbmllIHpiaW9ydSBhdXRvbWF0eWN6bmllIElPS30NCklPS19wb2RtIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJcXCR0IixYNzAwKSkgJT4lDQogIG11dGF0ZShpbGVfZ2F0dW5rb3cgPSBpZmVsc2Uocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIixzdHJfY291bnQoWDY1NSwiXFwkYSIpLCJuaWUiKSwNCiAgICAgICAgIHR5bGtvX3BvZG1pb3Rvd2UgPSBpZmVsc2Uoc3RyX2NvdW50KFg2NTUsIlxcJGEiKT4wJnN0cl9jb3VudChYNjU1LCJcXCRhIik9PXN0cl9jb3VudChYNjU1LCJcXCR5Iikmc3RyX2NvdW50KFg2NTUsIlxcJHkiKSE9c3RyX2NvdW50KFg2NTUsIlxcJHgiKSwidGFrIiwibmllIikpICU+JQ0KICBmaWx0ZXIoc3RyX2NvdW50KFgxMDAsIlxcJGEiKT09MSkgJT4lDQogIGZpbHRlcighZ3JlcGwoInBzZXVkfG5hendhIixYNTAwLGlnbm9yZS5jYXNlID0gVFJVRSkmWDUwMT09IiImKHR5bGtvX3BvZG1pb3Rvd2U9PSJ0YWsifGlsZV9nYXR1bmtvdz09IjEiKSZYMTAwIT0iIikNCg0KI3plc3Rhd2llbmllIDEwMCBpIDI0NQ0KIzEwMA0KbWFyY19maWVsZF8xMDAgPC0gSU9LX3BvZG0gJT4lDQogIHNlbGVjdChpZCxYMTAwKSU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKElPS19wb2RtJFgxMDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8xMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMTAwPC1jYmluZChtYXJjX2ZpZWxkXzEwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzEwMCRYMTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMTAwJFgxMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMTAwJFgxMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzEwMCRYMTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzEwMCA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiAgc2VsZWN0KGlkLGAkYWApICU+JQ0KICBtdXRhdGUoYm5fbmF6d2lza28gPSBpZmVsc2Uoc3RyX2RldGVjdChgJGFgLCIsIiksc3RyX3JlcGxhY2UoYCRhYCwiXiguKj8pKCwgKSguKj8kKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihgJGFgKSksDQogICAgICAgICBibl9pbWllID0gaWZlbHNlKHN0cl9kZXRlY3QoYCRhYCwiLCIpLHN0cl9yZXBsYWNlKGAkYWAsIl4oLio/KSgsICkoLio/JCkiLCJcXDMiKSwiIikpICU+JQ0KICBzZWxlY3QoaWQsYm5fbmF6d2lza28sYm5faW1pZSkNCg0KSU9LX3BvZG0gPC0gSU9LX3BvZG0gJT4lDQogIGZ1bGxfam9pbiguLG1hcmNfZmllbGRfMTAwLGJ5ID0gImlkIikNCg0KeCA8LSAxOmxlbmd0aChJT0tfcG9kbSRpZCkNCmZvciAoaSBpbiB4KSB7DQogIA0KICBJT0tfcG9kbSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoSU9LX3BvZG0kYm5fbmF6d2lza29baV0sSU9LX3BvZG0kWDI0NVtpXSkNCiAgSU9LX3BvZG0kY3p5X2ltaWVbaV0gPC0gZ3JlcGwoSU9LX3BvZG0kYm5faW1pZVtpXSxJT0tfcG9kbSRYMjQ1W2ldKQ0KICANCn0NCiN1c3VuacSZY2llIHR5Y2gsIGt0w7NyZSBuaWUgbWFqxIUgdHl0dcWCw7N3IG9yeWdpbmFsbnljaA0KSU9LX3BvZG0gPC0gSU9LX3BvZG0gJT4lDQogIGZpbHRlcihjenlfbmF6d2lza289PTEmY3p5X2ltaWU9PTEmIWdyZXBsKCJldCBhbFxcLiIsWDI0NSkpICU+JQ0KICBzZWxlY3QoLWJuX25hendpc2tvLC1ibl9pbWllLC1jenlfbmF6d2lza28sLWN6eV9pbWllKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShqZXp5ayA9IHN0cl9leHRyYWN0KFgwNDEsKCIoPzw9XFwkaCkoLi4uKSIpKSkgJT4lDQogIG11dGF0ZShjenlfdHl0dWxfb2JjeSA9IGlmZWxzZShpcy5uYShqZXp5ayksIm5pZSBkb3R5Y3p5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghZ3JlcGwoInBvbCIsamV6eWspLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShYMjQ2IT0iIiwib2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIlR5dFssXFwuXSBvcnlnIixYNTAxKXxncmVwbCgiVHl0WyxcXC5dIG9yeWciLFg1MDApLCJvayIsInByb2JsZW0iKSksIm5pZSBkb3R5Y3p5IikpKSAlPiUNCiAgZmlsdGVyKGN6eV90eXR1bF9vYmN5IT0icHJvYmxlbSIpICU+JQ0KICBzZWxlY3QoaWQpICU+JQ0KICBtdXRhdGUoYXV0b21hdHljem5hX3BvZG1pb3Rvd2EgPSAidGFrIikNCiMjI3R1dGFqIGtvxYRjesSFIHNpxJkgYXV0b21hdHljem5lIHBvZG1pb3Rvd2UNCg0KI2F1dG9tYXR5Y3pueSBJT0sgZGxhIHByemVkbWlvdG93eWNoOyBvc29iYSB6IFBCTCBqYWtvIHRlbWF0DQojNjAwDQpJT0tfcHJ6ZWRtIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoc3RyX2NvdW50KFg2MDAsIlxcJGEiKT09MSkNCm1hcmNfZmllbGRfNjAwIDwtIElPS19wcnplZG0gJT4lDQogIHNlbGVjdChpZCxYNjAwKSU+JQ0KICBmaWx0ZXIoWDYwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDYwMD1zdHJfcmVwbGFjZV9hbGwoWDYwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2MDA9c3RyX3JlbW92ZV9hbGwoWDYwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKElPS19wcnplZG0kWDYwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzYwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82MDA8LWNiaW5kKG1hcmNfZmllbGRfNjAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQoNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjAwJFg2MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82MDAkWDYwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82MDAkWDYwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjAwJFg2MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNjAwIDwtIG1hcmNfZmllbGRfNjAwICU+JQ0KICBzZWxlY3QoaWQsYCRhYCxgJGRgLGAkY2ApICU+JQ0KICBtdXRhdGUobmFtZSA9IGlmZWxzZSghaXMubmEoYCRjYCkmc3Vic3RyKGAkY2AsbmNoYXIoYCRjYCksbmNoYXIoYCRjYCkpPT0iOyIscGFzdGUoYCRhYCxgJGNgLGAkZGAsc2VwID0gIiAiKSxpZmVsc2UoIWlzLm5hKGAkZGApLHBhc3RlKGAkYWAsYCRkYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpKSAlPiUNCiAgc2VsZWN0KGlkLG5hbWUpICU+JQ0KICBtdXRhdGUobmFtZSA9IHN0cl9yZXBsYWNlKG5hbWUsIihcXCkpKFxcLiQpIiwiXFwxIiksDQogICAgICAgICBuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwgIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIiwiXFwxIikpDQoNCnR3b3JjYV9pX2R6aWFsIDwtIGRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHR3LnR3X3R3b3JjYV9pZCBcInBibF9pZFwiLCB0dy50d19uYXp3aXNrb3x8JywgJ3x8dHcudHdfaW1pZSBcInR3b3JjYV9wYmxcIiwgZHouZHpfZHppYWxfaWR8fCd8J3x8ZHouZHpfbmF6d2EgXCJvc29iYV9wYmxfZHppYWxfaWRfbmFtZVwiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBibF90d29yY3kgdHcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgam9pbiBwYmxfZHppYWx5IGR6IG9uIGR6LmR6X2R6aWFsX2lkPXR3LnR3X2R6X2R6aWFsX2lkIikNCg0KYm5fcmVjb3Jkc19wYmxfcGVvcGxlIDwtIG1hcmNfZmllbGRfNjAwICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgaW5uZXJfam9pbiguLHBibF92aWFmLGJ5ID0gYygibmFtZSIgPSAiQk5fbmFtZSIpKSAlPiUNCiAgc2VsZWN0KDE6MykgJT4lDQogIGxlZnRfam9pbiguLHR3b3JjYV9pX2R6aWFsLGJ5ID0gInBibF9pZCIpDQpibl9yZWNvcmRzX3BibF9wZW9wbGVfaWQgPC0gYm5fcmVjb3Jkc19wYmxfcGVvcGxlICU+JQ0KICBzZWxlY3QoaWQsdHdvcmNhX3BibCkgJT4lDQogIGdyb3VwX2J5KGlkKSAlPiUNCiAgbXV0YXRlKHR3b3JjYV9wYmwgPSBwYXN0ZSh1bmlxdWUodHdvcmNhX3BibCksY29sbGFwc2UgPSAifiIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgifiIsdHdvcmNhX3BibCkpDQoNCklPS19wcnplZG0gPC0gSU9LX3ByemVkbSAlPiUNCiAgZnVsbF9qb2luKC4sYm5fcmVjb3Jkc19wYmxfcGVvcGxlX2lkLGJ5ID0gImlkIikgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSImWDYwMCE9IiImc3RyX2NvdW50KFg2MDAsIlxcJGEiKT09MSYhaXMubmEodHdvcmNhX3BibCkpICU+JQ0KICBtdXRhdGUoY3p5X29fY3p5bXMgPSBzdHJfZGV0ZWN0KFg2NTUsIlxcJHgiKSkNCklPS19wcnplZG0kY3p5X2dhdHVuZWsgPC0gZ3JlcGwoZ2F0dW5raV9wb2RtaW90b3dlLElPS19wcnplZG0kWDY1NSkNCklPS19wcnplZG0gPC0gSU9LX3ByemVkbSAlPiUNCiAgZmlsdGVyKChncmVwbCgidGVtYXR5a2F8YmlvZ3JhZmlhfGhpc3RvcmlhIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Y3p5X29fY3p5bXM9PVRSVUUpJiFncmVwbCgiS3NpxJlnYSBwYW1pxIV0a293YSIsWDY1NSkpICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIigoYXw6KSg4MjEpKXwoNzkxKSIsWDA4MCkpICU+JQ0KICBzZWxlY3QoaWQpICU+JQ0KICBtdXRhdGUoYXV0b21hdHljem5hX3ByemVkbWlvdG93YSA9ICJ0YWsiKQ0KDQpibl9vayA8LSBibl9vayAlPiUNCiAgZnVsbF9qb2luKC4sSU9LX3BvZG0sYnkgPSAiaWQiKSAlPiUNCiAgZnVsbF9qb2luKC4sSU9LX3ByemVkbSxieSA9ICJpZCIpICU+JQ0KICBtdXRhdGUoY3p5X2F1dG9tYXR5Y3puaWUgPSBpZmVsc2UoIWlzLm5hKGF1dG9tYXR5Y3puYV9wb2RtaW90b3dhKSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGF1dG9tYXR5Y3puYV9wcnplZG1pb3Rvd2EpLCJwcnplZG1pb3Rvd2EiLCJuaWUiKSkpICU+JQ0KICBzZWxlY3QoLWF1dG9tYXR5Y3puYV9wb2RtaW90b3dhLC1hdXRvbWF0eWN6bmFfcHJ6ZWRtaW90b3dhKSAlPiUNCiAgbXV0YXRlKGN6eV9hdXRvbWF0eWN6bmllID0gaWZlbHNlKGN6eV9hdXRvbWF0eWN6bmllPT0icG9kbWlvdG93YSImcm9kemFqX2tzaWF6a2khPSJwb2RtaW90b3dhIiwibmllIixhcy5jaGFyYWN0ZXIoY3p5X2F1dG9tYXR5Y3puaWUpKSkNCg0KI3dyaXRlLmNzdjIoYm5fb2ssICJDOi9Vc2Vycy9DZXphcnkvRGVza3RvcC9ibl9va18yMDA5LmNzdiIsIHJvdy5uYW1lcyA9IEYsIG5hID0gJycsIGZpbGVFbmNvZGluZyA9ICdVVEYtOCcpDQpgYGANCg0KYGBge3Igd3l6bmFjemVuaWUgemJpb3J1IG5hIGRvIHV6dXBlxYJuaWVuaWEgdyBwcnp5c3rFgm/Fm2NpfQ0KbmFfcG96bmllaiA8LSBibl9vayAlPiUNCiAgZmlsdGVyKGN6eV9hdXRvbWF0eWN6bmllPT0ibmllIiZyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSImZHppZWR6aW5hX1BCTD09ImJlel91a2RfUEJMIikgJT4lDQogIG11dGF0ZShrYXRlZ29yaWVfbGl0ZXJhY2tpZSA9IGlmZWxzZShncmVwbCgibWl0b2xvZ3xiYcWbfGJhamt8cG9lemp8bGlyeWt8ZXBpa3xkcmFtYXR8bGl0ZXJhY3xsaXRlcmF0fHBpc2FyfHdpZXJzenxwcm96fHBvd2llxZt8b3Bvd2lhZHxtaW5pYXR1cnxhZm9yeXptfGVzZWp8c3praWN8ZmVsaWV0fHJlcG9ydHxkemllbm5pfHdzcG9tbmllfGF1dG9iaW9ncmFmfGthemF8cm96bXnFm2x8bGlzdCIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJtaXRvbG9nfGJhxZt8YmFqa3xwb2V6anxsaXJ5a3xlcGlrfGRyYW1hdHxsaXRlcmFjfGxpdGVyYXR8cGlzYXJ8d2llcnN6fHByb3p8cG93aWXFm3xvcG93aWFkfG1pbmlhdHVyfGFmb3J5em18ZXNlanxzemtpY3xmZWxpZXR8cmVwb3J0fGR6aWVubml8d3Nwb21uaWV8YXV0b2Jpb2dyYWZ8a2F6YXxyb3ptecWbbHxsaXN0IixYNjU1LCBpZ25vcmUuY2FzZSA9IFRSVUUpLCJ0YWsiLCJuaWUiKSkgJT4lDQogIGZpbHRlcihrYXRlZ29yaWVfbGl0ZXJhY2tpZT09Im5pZSIpICU+JQ0KICBtdXRhdGUobGF0YSA9IGlmZWxzZShncmVwbCgiXFxkezJ9LSIsWDEwMCksc3RyX3JlcGxhY2UoWDEwMCwiKC4qXFwkZFxcKC4qPykoXFxkezIsNH0pKFxcP3swLDF9LS4qKSIsIlxcMiIpLE5BKSwNCiAgICAgICAgIGxhdGFfdGVtYXQgPSBpZmVsc2UoZ3JlcGwoIlxcZHsyfS0iLFg2MDApLHN0cl9yZXBsYWNlKFg2MDAsIiguKlxcJGRcXCguKj8pKFxcZHsyLDR9KShcXD97MCwxfS0uKikiLCJcXDIiKSxOQSkpICU+JQ0KZmlsdGVyKChpcy5uYShsYXRhKSZpcy5uYShsYXRhX3RlbWF0KSl8IShhcy5pbnRlZ2VyKGxhdGEpPDE4MDApfCEoYXMuaW50ZWdlcihsYXRhX3RlbWF0KTwxODAwKSkgJT4lDQogIHNlbGVjdChpZCkNCg0Kd3JpdGUuY3N2MihuYV9wb3puaWVqLCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvYm5fMjAwOV9rc19uYV9wb3puaWVqLmNzdiIsIHJvdy5uYW1lcyA9IEYsIG5hID0gJycsIGZpbGVFbmNvZGluZyA9ICdVVEYtOCcpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBuYV9wb3puaWVqIGIpIikNCmBgYA0KDQpDenkgamVzdCBzZW5zIHRvIHJvYmnEhz8NCmBgYHtyIGF1dG9tYXR5Y3puZSBkemlhxYJvd2FuaWUgcHJ6ZWRtaW90b3dlan0NCiMjI2F1dG9tYXR5Y3puaWUgZHppYcWCb3dhbmllIHByemVkbWlvdG93ZWogbmEgcG9kc3Rhd2llIGRvdHljaGN6YXNvd3ljaCBpbXBvcnTDs3cNCiN6YXBpc3kgPC0gUkpEQkM6OmRiR2V0UXVlcnkoUEJMLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHouemFfemFwaXNfaWQsIGR6LmR6X2R6aWFsX2lkLCBkei5kel9uYXp3YSwgei56YV9zdGF0dXNfaW1wLCB6LnphX3V3YWdpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGJsX3phcGlzeSB6DQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gcGJsX2R6aWFseSBkeiBvbiBkei5kel9kemlhbF9pZD16LnphX2R6X2R6aWFsMV9pZA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB6LnphX3V3YWdpIGxpa2UgJyVpbXBvcnQlJyIpICU+JQ0KIyAgbXV0YXRlKHByYWNvd25pa19wYmwgPSBzdHJfZXh0cmFjdChaQV9VV0FHSSwgIig/PD1ha2NlcHR1amU6KShbQS1aXSopIikpICU+JQ0KIyAgc2VsZWN0KC1aQV9VV0FHSSkNCiMNCiNwb3ByemVkbmllX2ltcG9ydHkgPC0gcmJpbmQobGlzdHlfMjAwNCxsaXN0eV8yMDA1LGxpc3R5XzIwMDYsbGlzdHlfMjAwNyxsaXN0eV8yMDA4KSAlPiUNCiMgIGZ1bGxfam9pbiguLHphcGlzeSxieSA9ICJaQV9aQVBJU19JRCIpICU+JQ0KIyAgc2VsZWN0KFg2NTAsWDY1NSxEWl9EWklBTF9JRCxEWl9OQVpXQSxaQV9TVEFUVVNfSU1QKSAlPiUNCiMgIG11dGF0ZShYNjUwID0gc3RyX3JlbW92ZV9hbGwoWDY1MCwiXFxcXDciKSwNCiMgICAgICAgICBYNjU1ID0gc3RyX3JlbW92ZV9hbGwoWDY1NSwiXFxcXDciKSwNCiMgICAgICAgICBYNjUwID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFg2NTAsIihcXCRhKSIsIlxcXFwjN1xcMSIpLCIjIiksDQojICAgICAgICAgWDY1NSA9IHN0cl9yZW1vdmVfYWxsKHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpKSAlPiUNCiMgIGdyb3VwX2J5X2F0KHZhcnMoWDY1MDpEWl9OQVpXQSkpICU+JQ0KIyAgbXV0YXRlKFpBX1NUQVRVU19JTVAgPSBwYXN0ZShaQV9TVEFUVVNfSU1QLGNvbGxhcHNlID0gInwiKSkgJT4lDQojICB1bmdyb3VwKCkgJT4lDQojICB1bmlxdWUoKSAlPiUNCiMgIHVuZ3JvdXAoKSAlPiUNCiMgIGZpbHRlcighZ3JlcGwoIlxcfCIsRFpfRFpJQUxfSUQpKSAlPiUNCiMgIGZpbHRlcihncmVwbCgiSU9LIixaQV9TVEFUVVNfSU1QKSkgJT4lDQojICBmaWx0ZXIoIWdyZXBsKCJJTk98SU1QfElQTnxJUEMiLFpBX1NUQVRVU19JTVApKSAlPiUNCiMgIGZpbHRlcighZ3JlcGwoIm9zb2Jvd2UiLERaX05BWldBKSkgJT4lDQojICBmaWx0ZXIoIShpcy5uYShYNjUwKSZpcy5uYShYNjU1KSkpICU+JQ0KIyAgbXV0YXRlKGlsZTY1MCA9IHN0cl9jb3VudChYNjUwLCJcXHwiKSsxLA0KIyAgICAgICAgIGlsZTY1NSA9IHN0cl9jb3VudChYNjU1LCJcXHwiKSsxKSAlPiUNCiMgIGZpbHRlcihpbGU2NTA8PTEwfGlsZTY1NTw9MTApICU+JQ0KIyAgc2VsZWN0KC1pbGU2NTAsLWlsZTY1NSkgJT4lDQojICBtdXRhdGUoaWxlX3N0YXR1c293ID0gc3RyX2NvdW50KFpBX1NUQVRVU19JTVAsIlxcfCIpKzEpICU+JQ0KIyAgYXJyYW5nZShYNjU1LFg2NTAsLWlsZV9zdGF0dXNvdykNCiNwb3ByemVkbmllX2ltcG9ydHkkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKHBvcHJ6ZWRuaWVfaW1wb3J0eVsxOjJdKSkNCiNwb3ByemVkbmllX2ltcG9ydHkgPC0gcG9wcnplZG5pZV9pbXBvcnR5WyFkdXBsaWNhdGVkKHBvcHJ6ZWRuaWVfaW1wb3J0eSRpZF9ncnVweSksXSAlPiUNCiMgIG11dGF0ZShpZCA9IHJvd19udW1iZXIoKSkgJT4lDQojICBzZWxlY3QoLWlsZV9zdGF0dXNvdywtaWRfZ3J1cHkpDQojDQojZG9fZHppYWxvd2FuaWEgPC0gZGF0YS5mcmFtZShpZCA9IGFzLmludGVnZXIoKSwgWDY1MCA9IGFzLmNoYXJhY3RlcigpLCBYNjU1ID0gYXMuY2hhcmFjdGVyKCksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCiN4IDwtIDE6bGVuZ3RoKHBvcHJ6ZWRuaWVfaW1wb3J0eSRpZCkNCiNmb3IgKGkgaW4geCl7DQojICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KIyAgICBpZiAoaXMubmEocG9wcnplZG5pZV9pbXBvcnR5JFg2NTBbaV0pJiFpcy5uYShwb3ByemVkbmllX2ltcG9ydHkkWDY1NVtpXSkpew0KIyAgICAgIHBlcm11dGF0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKHBlcm11dGF0aW9ucyh1bmxpc3Qoc3RyX3NwbGl0KHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjU1W2ldLCJcXHwiKSksIHN0cl9jb3VudChwb3ByemVkbmllX2ltcG9ydHkkWDY1NVtpXSwiXFx8IikrMSkpICU+JQ0KIyAgICAgICAgdW5pdGUoZGF0YT0uLGNvbCA9ICJwZXJtdXRhdGlvbiIsIHNlcCA9ICJ8IikgJT4lDQojICAgICAgICBtdXRhdGUoWDY1MCA9IE5BLA0KIyAgICAgICAgICAgICAgIFg2NTUgPSBwZXJtdXRhdGlvbiwNCiMgICAgICAgICAgICAgICBpZCA9IHBvcHJ6ZWRuaWVfaW1wb3J0eSRpZFtpXSkgJT4lDQojICAgICAgICBzZWxlY3QoaWQsWDY1MCxYNjU1KQ0KIyAgICAgIGRvX2R6aWFsb3dhbmlhIDwtIHJiaW5kKGRvX2R6aWFsb3dhbmlhLHBlcm11dGF0aW9ucykNCiMgICAgfSBlbHNlIGlmIChpcy5uYShwb3ByemVkbmllX2ltcG9ydHkkWDY1NVtpXSkmIWlzLm5hKHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjUwW2ldKSl7DQojICAgICAgcGVybXV0YXRpb25zIDwtIGFzLmRhdGEuZnJhbWUocGVybXV0YXRpb25zKHVubGlzdChzdHJfc3BsaXQocG9wcnplZG5pZV9pbXBvcnR5JFg2NTBbaV0sIlxcfCIpKSwgc3RyX2NvdW50KHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjUwW2ldLCJcXHwiKSsxKSkgJT4lDQojICAgICAgICB1bml0ZShkYXRhPS4sY29sID0gInBlcm11dGF0aW9uIiwgc2VwID0gInwiKSAlPiUNCiMgICAgICAgIG11dGF0ZShYNjUwID0gcGVybXV0YXRpb24sDQojICAgICAgICAgICAgICAgWDY1NSA9IE5BLA0KIyAgICAgICAgICAgICAgIGlkID0gcG9wcnplZG5pZV9pbXBvcnR5JGlkW2ldKSAlPiUNCiMgICAgICAgIHNlbGVjdChpZCxYNjUwLFg2NTUpDQojICAgICAgZG9fZHppYWxvd2FuaWEgPC0gcmJpbmQoZG9fZHppYWxvd2FuaWEscGVybXV0YXRpb25zKQ0KIyAgICB9IGVsc2Ugew0KIyAgICAgIHBlcm11dGF0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKHBlcm11dGF0aW9ucyh1bmxpc3Qoc3RyX3NwbGl0KHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjUwW2ldLCJcXHwiKSksIHN0cl9jb3VudChwb3ByemVkbmllX2ltcG9ydHkkWDY1MFtpXSwiXFx8IikrMSkpICU+JQ0KIyAgICAgICAgdW5pdGUoZGF0YT0uLGNvbCA9ICJwZXJtdXRhdGlvbiIsIHNlcCA9ICJ8IikgJT4lDQojICAgICAgICBtdXRhdGUoWDY1MCA9IHBlcm11dGF0aW9uLA0KIyAgICAgICAgICAgICAgIGlkID0gcG9wcnplZG5pZV9pbXBvcnR5JGlkW2ldKSAlPiUNCiMgICAgICAgIHNlbGVjdChpZCxYNjUwKQ0KIyAgICAgIHBlcm11dGF0aW9uczY1MCA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCiMgICAgICBwZXJtdXRhdGlvbnM2NTAgPC0gcmJpbmQocGVybXV0YXRpb25zNjUwLHBlcm11dGF0aW9ucykNCiMgICAgICBwZXJtdXRhdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShwZXJtdXRhdGlvbnModW5saXN0KHN0cl9zcGxpdChwb3ByemVkbmllX2ltcG9ydHkkWDY1NVtpXSwiXFx8IikpLCBzdHJfY291bnQocG9wcnplZG5pZV9pbXBvcnR5JFg2NTVbaV0sIlxcfCIpKzEpKSAlPiUNCiMgICAgICAgIHVuaXRlKGRhdGE9Lixjb2wgPSAicGVybXV0YXRpb24iLCBzZXAgPSAifCIpICU+JQ0KIyAgICAgICAgbXV0YXRlKFg2NTUgPSBwZXJtdXRhdGlvbiwNCiMgICAgICAgICAgICAgICBpZCA9IHBvcHJ6ZWRuaWVfaW1wb3J0eSRpZFtpXSkgJT4lDQojICAgICAgICBzZWxlY3QoaWQsWDY1NSkNCiMgICAgICBwZXJtdXRhdGlvbnM2NTUgPC0gZGF0YS5mcmFtZShzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQojICAgICAgcGVybXV0YXRpb25zNjU1IDwtIHJiaW5kKHBlcm11dGF0aW9uczY1NSxwZXJtdXRhdGlvbnMpDQojICAgICAgcGVybXV0YXRpb25zIDwtIG1lcmdlKHBlcm11dGF0aW9uczY1MCxwZXJtdXRhdGlvbnM2NTUsYnkgPSAiaWQiLGFsbCA9IFRSVUUpICU+JQ0KIyAgICAgICAgc2VsZWN0KGlkLFg2NTAsWDY1NSkNCiMgICAgICBkb19kemlhbG93YW5pYSA8LSByYmluZChkb19kemlhbG93YW5pYSxwZXJtdXRhdGlvbnMpDQojICAgIH0NCiN9DQojDQojZG9fZHppYWxvd2FuaWEgPC0gZG9fZHppYWxvd2FuaWEgJT4lDQojICBmdWxsX2pvaW4oLixwb3ByemVkbmllX2ltcG9ydHkgJT4lIHNlbGVjdChpZCxEWl9EWklBTF9JRCxEWl9OQVpXQSksYnkgPSAiaWQiKSAlPiUNCiMgIHNlbGVjdCgtaWQpDQojZG9fZHppYWxvd2FuaWFbaXMubmEoZG9fZHppYWxvd2FuaWEpXSA8LSAiIg0KIyMjIyN0dXRhaiBzcHJhd2R6acSHDQojZG9fZHppYWxvd2FuaWFfcHJ6ZWRtIDwtIG1lcmdlKGJuX29rICU+JSBmaWx0ZXIoY3p5X2F1dG9tYXR5Y3puaWU9PSJuaWUiJnJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIiksZG9fZHppYWxvd2FuaWEsIGJ5ID0gYygiWDY1MCIsIlg2NTUiKSkgJT4lDQojICBzZWxlY3QoaWQsRFpfRFpJQUxfSUQsRFpfTkFaV0EpDQpgYGANCg0KYGBge3Igd2N6eXRhbmllIGRhbnljaCBQQkx9DQojd2N6eXRhbmllIGthcnRvdGVrIFBCTA0KcmVkYWt0b3J6eV9kemlhbG93IDwtIHNoZWV0c19yZWFkKHNzID0gIjFCYWplLVpmUGdBS0VEQW9EemVvX2VDQkRyc0w3akFYdDZ1YlAyY2VkYkZjIiwgc2hlZXQgPSAicmVkYWt0b3J6eV9kemlhxYLDs3ciKSAlPiUNCiAgc2VsZWN0KERaX0RaSUFMX0lELCBEWl9OQVpXQSwgcmVkYWt0b3JfZHppYWx1KSAjJT4lDQogICNtdXRhdGUoRFpfRFpJQUxfSUQgPSBhcy5jaGFyYWN0ZXIoRFpfRFpJQUxfSUQpKQ0KDQpQQkxfZHppYWx5IDwtIGRiUmVhZFRhYmxlKFBCTCwnUEJMX0RaSUFMWScpICU+JQ0KICBzZWxlY3QoMSwzLDYpDQoNClBCTF9kemlhbHlfcGF0aCA8LSBtZXJnZSh4ID0gUEJMX2R6aWFseSwgeSA9IFBCTF9kemlhbHksIGJ5LnggPSAiRFpfRFpfRFpJQUxfSUQiLCBieS55ID0gIkRaX0RaSUFMX0lEIiwgYWxsLnggPSBUUlVFKQ0KY29sbmFtZXMoUEJMX2R6aWFseV9wYXRoKSA8LSBjKCJOQURfRFpfRFpJQUxfSUQiLCAiRFpfRFpJQUxfSUQiLCAiRFpfTkFaV0EiLCAiTkFEX0RaX05BWldBIiwgIk5BRF9OQURfRFpfRFpJQUxfSUQiKQ0KDQpQQkxfZHppYWx5X3BhdGggPC0gbWVyZ2UoeCA9IFBCTF9kemlhbHlfcGF0aCwgeSA9IFBCTF9kemlhbHksIGJ5LnggPSAiTkFEX05BRF9EWl9EWklBTF9JRCIsIGJ5LnkgPSAiRFpfRFpJQUxfSUQiLCBhbGwueCA9IFRSVUUpDQpjb2xuYW1lcyhQQkxfZHppYWx5X3BhdGgpIDwtIGMoIk5BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX0RaX0RaSUFMX0lEIiwgIkRaX0RaSUFMX0lEIiwgIkRaX05BWldBIiwgIk5BRF9EWl9OQVpXQSIsICJOQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX0RaX0RaSUFMX0lEIikNCg0KUEJMX2R6aWFseV9wYXRoIDwtIG1lcmdlKHggPSBQQkxfZHppYWx5X3BhdGgsIHkgPSBQQkxfZHppYWx5LCBieS54ID0gIk5BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgYnkueSA9ICJEWl9EWklBTF9JRCIsIGFsbC54ID0gVFJVRSkNCmNvbG5hbWVzKFBCTF9kemlhbHlfcGF0aCkgPC0gYygiTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfRFpfRFpJQUxfSUQiLCAiRFpfRFpJQUxfSUQiLCAiRFpfTkFaV0EiLCAiTkFEX0RaX05BWldBIiwgIk5BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfTkFEX0RaX0RaSUFMX0lEIikNCg0KUEJMX2R6aWFseV9wYXRoIDwtIG1lcmdlKHggPSBQQkxfZHppYWx5X3BhdGgsIHkgPSBQQkxfZHppYWx5LCBieS54ID0gIk5BRF9OQURfTkFEX05BRF9EWl9EWklBTF9JRCIsIGJ5LnkgPSAiRFpfRFpJQUxfSUQiLCBhbGwueCA9IFRSVUUpDQpjb2xuYW1lcyhQQkxfZHppYWx5X3BhdGgpIDwtIGMoIk5BRF9OQURfTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9EWl9EWklBTF9JRCIsICJEWl9EWklBTF9JRCIsICJEWl9OQVpXQSIsICJOQURfRFpfTkFaV0EiLCAiTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfTkFEX05BRF9EWl9EWklBTF9JRCIpDQoNClBCTF9kemlhbHlfcGF0aCA8LSBtZXJnZSh4ID0gUEJMX2R6aWFseV9wYXRoLCB5ID0gUEJMX2R6aWFseSwgYnkueCA9ICJOQURfTkFEX05BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgYnkueSA9ICJEWl9EWklBTF9JRCIsIGFsbC54ID0gVFJVRSkNCmNvbG5hbWVzKFBCTF9kemlhbHlfcGF0aCkgPC0gYygiTkFEX05BRF9OQURfTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfRFpfRFpJQUxfSUQiLCAiRFpfRFpJQUxfSUQiLCAiRFpfTkFaV0EiLCAiTkFEX0RaX05BWldBIiwgIk5BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX05BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiKQ0KDQpQQkxfZHppYWx5X3BhdGggPC0gUEJMX2R6aWFseV9wYXRoICU+JQ0KICBzZWxlY3QoLWxlbmd0aChQQkxfZHppYWx5X3BhdGgpKSAlPiUNCiAgZmlsdGVyKERaX0RaSUFMX0lEIT0wKSAlPiUNCiAgc2VsZWN0KDYsNyw1LDgsNCw5LDMsMTAsMiwxMSwxLDEyKSAlPiUNCiAgdW5pcXVlKCkNCg0KUEJMX2R6X29zb2IgPC0gUEJMX2R6aWFseV9wYXRoICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9zb2Jvd2UiLCBEWl9OQVpXQSl8Z3JlcGwoIm9zb2Jvd2UiLCBOQURfRFpfTkFaV0EpfGdyZXBsKCJvc29ib3dlIiwgTkFEX05BRF9EWl9OQVpXQSl8Z3JlcGwoIm9zb2Jvd2UiLCBOQURfTkFEX05BRF9EWl9OQVpXQSl8Z3JlcGwoIm9zb2Jvd2UiLCBOQURfTkFEX05BRF9OQURfRFpfTkFaV0EpfGdyZXBsKCJvc29ib3dlIiwgTkFEX05BRF9OQURfTkFEX05BRF9EWl9OQVpXQSkpICU+JQ0KICBzZWxlY3QoMSwyLDMsNCw1LDYsNyw4KSAlPiUNCiAgZmlsdGVyKERaX0RaSUFMX0lEIT0xNDgpDQoNClBCTF9kel9vc29iXzEgPC0gUEJMX2R6X29zb2IgJT4lDQogIHNlbGVjdCgxLDIsMyw0KQ0KUEJMX2R6X29zb2JfMiA8LSBQQkxfZHpfb3NvYiAlPiUNCiAgc2VsZWN0KDEsMiw1LDYpDQpQQkxfZHpfb3NvYl8zIDwtIFBCTF9kel9vc29iICU+JQ0KICBzZWxlY3QoMSwyLDcsOCkNCmNvbG5hbWVzKFBCTF9kel9vc29iXzIpIDwtIGMobmFtZXMoUEJMX2R6X29zb2JfMSkpDQpjb2xuYW1lcyhQQkxfZHpfb3NvYl8zKSA8LSBjKG5hbWVzKFBCTF9kel9vc29iXzEpKQ0KUEJMX2R6X29zb2IgPC0gcmJpbmQoUEJMX2R6X29zb2JfMSxQQkxfZHpfb3NvYl8yLFBCTF9kel9vc29iXzMpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKE5BRF9EWl9EWklBTF9JRCkpICU+JQ0KICB1bmlxdWUoKQ0KUEJMX2R6X29zb2IgPC0gcmJpbmQoUEJMX2R6X29zb2IsIGMoIjE1MDQzIiwgIkhhc8WCYSBvc29ib3dlKGx1a3NlbWJ1cnNrYSkiLCIxNTA0MyIsICJIYXPFgmEgb3NvYm93ZShsdWtzZW1idXJza2EpIiksIGMoIjQzMCIsICJIYXPFgmEgb3NvYm93ZSAoTHVkemllIHRlYXRydSBpIGZpbG11KSIsIjQzMCIsICJIYXPFgmEgb3NvYm93ZSAoTHVkemllIHRlYXRydSBpIGZpbG11KSIpKQ0KUEJMX2R6X29zb2JfYmV6X3RlYXRydSA8LSBQQkxfZHpfb3NvYiAlPiUNCiAgZmlsdGVyKERaX0RaSUFMX0lEIT00MzApDQoNClBCTF90d29yY3kgPC0gZGJSZWFkVGFibGUoUEJMLCdQQkxfVFdPUkNZJykNCnR3X2lfZHpfcG9kbSA8LSBtZXJnZSh4PVBCTF90d29yY3kseT1QQkxfZHpfb3NvYl9iZXpfdGVhdHJ1LCBieS54ID0gIlRXX0RaX0RaSUFMX0lEIiwgYnkueSA9ICJOQURfRFpfRFpJQUxfSUQiLCBhbGwueCA9IFRSVUUpICU+JQ0KICBhcnJhbmdlKFRXX1RXT1JDQV9JRCkNCg0KdHdfaV9kel9wb2RtIDwtIGRhdGEuZnJhbWUodHdfaV9kel9wb2RtLCBwb2xfb3NvYiA9IGlmZWxzZSh0d19pX2R6X3BvZG0kVFdfRFpfRFpJQUxfSUQgPT0gMTQ4ICYgc3Vic3RyKHR3X2lfZHpfcG9kbSRUV19OQVpXSVNLTywxLDEpPT1zdHJfc3ViKHR3X2lfZHpfcG9kbSREWl9OQVpXQSxuY2hhcihhcy5jaGFyYWN0ZXIodHdfaV9kel9wb2RtJERaX05BWldBKSksbmNoYXIoYXMuY2hhcmFjdGVyKHR3X2lfZHpfcG9kbSREWl9OQVpXQSkpKSxUUlVFLEZBTFNFKSwgcG9sID0gaWZlbHNlKHR3X2lfZHpfcG9kbSRUV19EWl9EWklBTF9JRCA9PSAxNDgsIFRSVUUsIEZBTFNFKSkgJT4lDQogIGZpbHRlcihwb2xfb3NvYiA9PSBUUlVFIHwgcG9sID09IEZBTFNFKQ0KUEJMX3R3b3JjeV9wb2RtIDwtIHR3X2lfZHpfcG9kbSAlPiUNCiAgc2VsZWN0KFRXX1RXT1JDQV9JRCwgVFdfTkFaV0lTS08sIFRXX0lNSUUsIERaX0RaSUFMX0lELCBEWl9OQVpXQSwgVFdfTkFaV19XTEFTQ0lXRSwgVFdfUFNFVURPTklNWSwgVFdfREFUQV9VUk9EWklOLCBUV19EQVRBX1pHT05VLCBUV19ST0NaTklLSV9QQkwsIFRXX1NMT1dBX0tMVUNaT1dFLCBUV19VV0FHSSwgVFdfUk9LX1VST0RaSU4sIFRXX1JPS19aR09OVSwgVFdfTElDWkJBX1pBUElTT1csIFRXX0FETk9UQUNKRSwgVFdfVFJBTlNMSVRFUkFDSkUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkNCmNvbG5hbWVzKFBCTF90d29yY3lfcG9kbSkgPC0gYygiVFdfVFdPUkNBX0lEIiwgIlRXX05BWldJU0tPIiwgIlRXX0lNSUUiLCAiVFdfRFpfRFpJQUxfSUQiLCAiRFpfTkFaV0EiLCAiVFdfTkFaV19XTEFTQ0lXRSIsICJUV19QU0VVRE9OSU1ZIiwgIlRXX0RBVEFfVVJPRFpJTiIsICJUV19EQVRBX1pHT05VIiwgIlRXX1JPQ1pOSUtJX1BCTCIsICJUV19TTE9XQV9LTFVDWk9XRSIsICJUV19VV0FHSSIsICJUV19ST0tfVVJPRFpJTiIsICJUV19ST0tfWkdPTlUiLCAiVFdfTElDWkJBX1pBUElTT1ciLCAiVFdfQUROT1RBQ0pFIiwgIlRXX1RSQU5TTElURVJBQ0pFIikNClBCTF90d29yY3lfcG9kbSA8LSBQQkxfdHdvcmN5X3BvZG0gJT4lDQogIG11dGF0ZShuYXp3YSA9IGlmZWxzZShpcy5uYShUV19JTUlFKSxhcy5jaGFyYWN0ZXIoVFdfTkFaV0lTS08pLHBhc3RlKFRXX05BWldJU0tPLFRXX0lNSUUsIHNlcCA9ICIiKSksDQogICAgICAgICBuYXp3YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwobmF6d2EsICJcXFciLCAiIikpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKG5hendhKSwgIlxcVyIsICIiKSkNCg0KdHdfaV9keiA8LSBtZXJnZSh4PVBCTF90d29yY3kseT1QQkxfZHpfb3NvYiwgYnkueCA9ICJUV19EWl9EWklBTF9JRCIsIGJ5LnkgPSAiTkFEX0RaX0RaSUFMX0lEIiwgYWxsLnggPSBUUlVFKSAlPiUNCiAgYXJyYW5nZShUV19UV09SQ0FfSUQpDQp0d19pX2R6IDwtIGRhdGEuZnJhbWUodHdfaV9keiwgcG9sX29zb2IgPSBpZmVsc2UodHdfaV9keiRUV19EWl9EWklBTF9JRCA9PSAxNDggJiBzdWJzdHIodHdfaV9keiRUV19OQVpXSVNLTywxLDEpPT1zdHJfc3ViKHR3X2lfZHokRFpfTkFaV0EsbmNoYXIoYXMuY2hhcmFjdGVyKHR3X2lfZHokRFpfTkFaV0EpKSxuY2hhcihhcy5jaGFyYWN0ZXIodHdfaV9keiREWl9OQVpXQSkpKSxUUlVFLEZBTFNFKSwgcG9sID0gaWZlbHNlKHR3X2lfZHokVFdfRFpfRFpJQUxfSUQgPT0gMTQ4LCBUUlVFLCBGQUxTRSkpICU+JQ0KICBmaWx0ZXIocG9sX29zb2IgPT0gVFJVRSB8IHBvbCA9PSBGQUxTRSkNClBCTF90d29yY3kgPC0gdHdfaV9keiAlPiUNCiAgc2VsZWN0KFRXX1RXT1JDQV9JRCwgVFdfTkFaV0lTS08sIFRXX0lNSUUsIERaX0RaSUFMX0lELCBEWl9OQVpXQSwgVFdfTkFaV19XTEFTQ0lXRSwgVFdfUFNFVURPTklNWSwgVFdfREFUQV9VUk9EWklOLCBUV19EQVRBX1pHT05VLCBUV19ST0NaTklLSV9QQkwsIFRXX1NMT1dBX0tMVUNaT1dFLCBUV19VV0FHSSwgVFdfUk9LX1VST0RaSU4sIFRXX1JPS19aR09OVSwgVFdfTElDWkJBX1pBUElTT1csIFRXX0FETk9UQUNKRSwgVFdfVFJBTlNMSVRFUkFDSkUpDQpjb2xuYW1lcyhQQkxfdHdvcmN5KSA8LSBjKCJUV19UV09SQ0FfSUQiLCAiVFdfTkFaV0lTS08iLCAiVFdfSU1JRSIsICJUV19EWl9EWklBTF9JRCIsICJEWl9OQVpXQSIsICJUV19OQVpXX1dMQVNDSVdFIiwgIlRXX1BTRVVET05JTVkiLCAiVFdfREFUQV9VUk9EWklOIiwgIlRXX0RBVEFfWkdPTlUiLCAiVFdfUk9DWk5JS0lfUEJMIiwgIlRXX1NMT1dBX0tMVUNaT1dFIiwgIlRXX1VXQUdJIiwgIlRXX1JPS19VUk9EWklOIiwgIlRXX1JPS19aR09OVSIsICJUV19MSUNaQkFfWkFQSVNPVyIsICJUV19BRE5PVEFDSkUiLCAiVFdfVFJBTlNMSVRFUkFDSkUiKQ0KUEJMX3R3b3JjeSA8LSBQQkxfdHdvcmN5ICU+JQ0KICBtdXRhdGUobmF6d2EgPSBpZmVsc2UoaXMubmEoVFdfSU1JRSksYXMuY2hhcmFjdGVyKFRXX05BWldJU0tPKSxwYXN0ZShUV19OQVpXSVNLTyxUV19JTUlFLCBzZXAgPSAiIikpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKG5hendhLCAiXFxXIiwgIiIpKSwNCiAgICAgICAgIG5hendhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihuYXp3YSksICJcXFciLCAiIiksDQogICAgICAgICBUV19EWl9EWklBTF9JRCA9IGFzLm51bWVyaWMoVFdfRFpfRFpJQUxfSUQpKQ0KDQpQQkxfYXV0b3J6eSA8LSBkYlJlYWRUYWJsZShQQkwsJ1BCTF9BVVRPUlpZJykgJT4lDQogIG11dGF0ZShuYXp3YSA9IGlmZWxzZShpcy5uYShBTV9JTUlFKSxhcy5jaGFyYWN0ZXIoQU1fTkFaV0lTS08pLHBhc3RlKEFNX05BWldJU0tPLEFNX0lNSUUsIHNlcCA9ICIiKSksDQogICAgICAgICBuYXp3YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwobmF6d2EsICJcXFciLCAiIikpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKG5hendhKSwgIlxcVyIsICIiKSkgJT4lDQogIGZpbHRlcihuYXp3YSAhPSAibmFuYSIpDQoNClBCTF9hdXRvcl90b190d29yY2EgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMVJ1eVIzcFpsNHZOTHBySXFBV2dpV2Z2RzhFSmhZR2NMV2IyNEo3VndydkEiLCBzaGVldCA9ICJBcmt1c3oxIikNCg0KUEJMX3dzcG9sdHdvcmN5IDwtIGRiUmVhZFRhYmxlKFBCTCwnUEJMX09TT0JZJykgJT4lDQogIG11dGF0ZShuYXp3YV9wcm9zdGEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKGlmZWxzZShpcy5uYShPU19JTUlFKSxhcy5jaGFyYWN0ZXIoT1NfTkFaV0lTS08pLHBhc3RlKE9TX05BWldJU0tPLE9TX0lNSUUsIHNlcCA9ICIiKSkpLCAiXFxXIiwgIiIpKSAlPiUNCiAgZmlsdGVyKG5hendhX3Byb3N0YSAhPSJuYW5hIikNCg0KUEJMX2Z1bmtjamUgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMWh0bl9MNlJFczNHZEcxeFNpR0hJZnI2TUp2am1tVV9rVkd4aU1adENWMjQiLCBzaGVldCA9ICJBcmt1c3oxIikNCg0KUEJMX3d5ZGF3bmljdHdhIDwtIGRiUmVhZFRhYmxlKFBCTCwnUEJMX1dZREFXTklDVFdBJykgJT4lDQogIG11dGF0ZShuYXp3YV9wcm9zdGEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKHBhc3RlKFdZX01JQVNUTywgV1lfTkFaV0EpKSwgIlxcVyIsICIiKSkgJT4lDQogIGZpbHRlcihuYXp3YV9wcm9zdGEgIT0ibmFuYSIpDQoNClBCTF9yb2R6YWplX3phcGlzb3cgPC0gZGJSZWFkVGFibGUoUEJMLCdQQkxfUk9EWkFKRV9aQVBJU09XJykNCg0KQk5fUEJMX2xpc3RhX2xpdGVyYXR1ciA8LSBzaGVldHNfcmVhZChzcyA9ICIxemJ3am5ydFdHdmJqclFUTE1hdkpjV1N1N0hmUDBJLVVTTmdaX0tXaVhqYyIsIHNoZWV0ID0gImxpc3RhIHVrZCBibiIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHVrZF9vZ29sbmUpKSAlPiUNCiAgc2VsZWN0KDM6OSkgJT4lDQogIGNTcGxpdCguLGMoInBibF9pZCIsInBibF9uYXp3YSIsInJlZGFrdG9yX2R6aWFsdSIsInBibF9pZF9saXRlcmF0dXJ5IiwicGJsX2xpdGVyYXR1cmEiKSxzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwYmxfaWQpKQ0KDQpQQkxfaGFzbGFfb3NvYm93ZSA8LSBzaGVldHNfcmVhZChzcyA9ICIxemJ3am5ydFdHdmJqclFUTE1hdkpjV1N1N0hmUDBJLVVTTmdaX0tXaVhqYyIsIHNoZWV0ID0gInBibF9oYXNsYV9vc29ib3dlIikgJT4lDQogIHNlbGVjdCgyOjUpDQpjb2xuYW1lcyhQQkxfaGFzbGFfb3NvYm93ZSkgPC0gYygiRFpfRFpJQUxfSUQiLCJEWl9OQVpXQSIsInJlZGFrdG9yX2R6aWFsdSIsIm5hendhIikNCmBgYA0KDQpgYGB7ciBwcnp5cGlzYW5pZSByZWRha3RvcsOzdyBkbyBwcnplZG1pb3Rvd2VqLCBwb2RtaW90b3dlaiBpIGFudG9sb2dpaX0NCnByemVkbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKQ0KIyMjcHJ6eXBpc2FuaWUgcmVkYWt0b3JhIG5hIHBvZHN0YXdpZSBvc29ieSB6IDYwMCBqYWtvIHRlbWF0dSAtIGtzacSFxbxraSBvIHR3w7NyY3kNCiM2MDANCm1hcmNfZmllbGRfNjAwIDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoaWQsWDYwMCklPiUNCiAgZmlsdGVyKFg2MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2MDA9c3RyX3JlcGxhY2VfYWxsKFg2MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDYwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjAwIT0iIikgJT4lDQogIG11dGF0ZShYNjAwPXN0cl9yZW1vdmVfYWxsKFg2MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDYwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSRYNjAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzYwMDwtY2JpbmQobWFyY19maWVsZF82MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82MDAkWDYwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzYwMCRYNjAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzYwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzYwMCRYNjAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82MDAkWDYwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF82MDAgPC0gbWFyY19maWVsZF82MDAgJT4lDQogIHNlbGVjdChpZCxgJGFgLGAkZGAsYCRjYCkgJT4lDQogIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KICBzZWxlY3QoaWQsbmFtZSkgJT4lDQogIG11dGF0ZShuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwiKFxcKSkoXFwuJCkiLCJcXDEiKSwNCiAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkNCg0KbWFyY19maWVsZF82MDAgPC0gbWFyY19maWVsZF82MDAgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBpbm5lcl9qb2luKC4scGJsX3ZpYWYsYnkgPSBjKCJuYW1lIiA9ICJCTl9uYW1lIikpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfdHdvcmN5LGJ5ID0gYygicGJsX2lkIj0iVFdfVFdPUkNBX0lEIikpICU+JQ0KICBsZWZ0X2pvaW4oLixyZWRha3Rvcnp5X2R6aWFsb3csYnkgPSBjKCJUV19EWl9EWklBTF9JRCI9IkRaX0RaSUFMX0lEIikpICU+JQ0KICBzZWxlY3QoaWQsVFdfVFdPUkNBX0lEPXBibF9pZCxUV19OQVpXSVNLTyxUV19JTUlFLFRXX0RaX0RaSUFMX0lELERaX05BWldBPURaX05BWldBLngscmVkYWt0b3JfZHppYWx1KQ0KY291bnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShtYXJjX2ZpZWxkXzYwMCRpZCkpDQptYXJjX2ZpZWxkXzYwMCA8LSBtZXJnZShtYXJjX2ZpZWxkXzYwMCxjb3VudCxieS54ID0gImlkIiwgYnkueSA9ICJWYXIxIikgJT4lDQogIGZpbHRlcihGcmVxPDIpICU+JQ0KICBzZWxlY3QoLUZyZXEpICU+JQ0KICByZW5hbWUoRFpfRFpJQUxfSUQ9VFdfRFpfRFpJQUxfSUQpICU+JQ0KICBtdXRhdGUoUlpfUk9EWkFKX0lEID0gMiwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSBvIHR3w7NyY3kgKHByemVkbWlvdG93YSkiKQ0KDQojIyNwcnp5cGlzYW5pZSBkbyByZWRha3RvcsOzdyBuYSBwb2RzdGF3aWUgbGl0ZXJhdHVyeSB6IHBvbGEgNjU1DQpgJW5vdGluJWAgPC0gTmVnYXRlKGAlaW4lYCkNCnByemVkbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgbWFyY19maWVsZF82MDAkaWQpDQoNCiM2NTUNCm1hcmNfZmllbGRfNjU1IDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoaWQsWDY1NSklPiUNCiAgZmlsdGVyKFg2NTUhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTU9c3RyX3JlcGxhY2VfYWxsKFg2NTUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZW1vdmVfYWxsKFg2NTUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSRYNjU1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjU1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1NTwtY2JpbmQobWFyY19maWVsZF82NTUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTUkWDY1NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1NSRYNjU1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1NSRYNjU1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTUkWDY1NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBtYXJjX2ZpZWxkXzY1NSAlPiUNCiAgc2VsZWN0KGlkLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KDQpQQkxfbGl0ZXJhdHVyeV9vYmNlIDwtIFBCTF9kemlhbHlfcGF0aCAlPiUNCiAgZmlsdGVyKE5BRF9EWl9EWklBTF9JRD09MzApICU+JQ0KICBzZWxlY3QoMSwyKSAlPiUNCiAgbGVmdF9qb2luKC4scmVkYWt0b3J6eV9kemlhbG93LGJ5ID0gIkRaX0RaSUFMX0lEIikgJT4lDQogIGZpbHRlcighaXMubmEocmVkYWt0b3JfZHppYWx1KSkgJT4lDQogIHNlbGVjdCgxLERaX05BWldBID0gMiw0KSAlPiUNCiAgbXV0YXRlKG5hendhID0gc3Vic3RyKHN0cl9yZXBsYWNlKERaX05BWldBLCAiKC4qPykoICkoLio/KSIsIlxcMyIpLDEsbmNoYXIoc3RyX3JlcGxhY2UoRFpfTkFaV0EsICIoLio/KSggKSguKj8pIiwiXFwzIikpLTEpLA0KICAgICAgICAgbmF6d2EgPSBpZmVsc2UobmF6d2E9PSJyb21za2EgKGN5Z2HFhHNrYSIsInJvbXNrfGN5Z2HFhHNrIixhcy5jaGFyYWN0ZXIobmF6d2EpKSkNCg0KcmVjem5lIDwtIGRhdGEuZnJhbWUoRFpfRFpJQUxfSUQgPSBjKDMyLDMyLDMyLDMyLDU5LDg2LDEwNywxNDksNjcsNjksMzQsMzQsMzQsMzQsMzQsNTUsMzIsOTksMzQpLERaX05BWldBID0gYygiTGl0ZXJhdHVyYSBicnl0eWpza2EgaSBpcmxhbmR6a2EiLCJMaXRlcmF0dXJhIGJyeXR5anNrYSBpIGlybGFuZHprYSIsIkxpdGVyYXR1cmEgYnJ5dHlqc2thIGkgaXJsYW5kemthIiwiTGl0ZXJhdHVyYSBicnl0eWpza2EgaSBpcmxhbmR6a2EiLCJMaXRlcmF0dXJhIGdyZWNrYSBzdGFyb8W8eXRuYSIsIkxpdGVyYXR1cmEgxYJhY2nFhHNrYSDFm3JlZG5pb3dpZWN6bmEiLCJMaXRlcmF0dXJhIHN5cnlqc2thIiwiTGl0ZXJhdHVyYSBlc3BlcmFudG8iLCJMaXRlcmF0dXJhIGhvbGVuZGVyc2thIiwiTGl0ZXJhdHVyeSBJbmRpaSIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsICJMaXRlcmF0dXJhIGVnaXBza28tYXJhYnNrYSIsICJMaXRlcmF0dXJhIGJyeXR5anNrYSBpIGlybGFuZHprYSIsIkxpdGVyYXR1cmEgcGFsZXN0ecWEc2tvLWFyYWJza2EiLCJMaXRlcmF0dXJ5IEFmcnlraSBTdWJzYWhhcnlqc2tpZWoiKSwgcmVkYWt0b3JfZHppYWx1ID0gYygiQkVBVEFLIiwiQkVBVEFLIiwiQkVBVEFLIiwiQkVBVEFLIiwiQkVBVEFTIiwiQkVBVEFTIiwiQkVBVEFEIiwiQ0VaQVJZIiwiVE9NQVNaVSIsIkVXQSIsIkVXQSIsIkVXQSIsIkVXQSIsIkVXQSIsIkVXQSIsIkJFQVRBRCIsIkJFQVRBSyIsIkJFQVRBRCIsIkVXQSIpLCBuYXp3YSA9IGMoImFuZ2llbHNrIiwic3prb2NrIiwiaXJsYW5kemsiLCJ3YWxpanNrIiwiZ3JlY2siLCLFgmFjacWEc2siLCJzeXJ5anNrIiwiZXNwZXJhbmNrIiwibmlkZXJsYW5kemsiLCJpbmR5anNrIiwicG/FgnVkbmlvd29hZnJ5a2EiLCJzZW5lZ2Fsc2siLCJuaWdlcnlqc2siLCJhZnJ5a2HFhHNrIiwicnVhbmR5anNrIiwiZWdpcHNrLiBub3dvxbx5dG4iLCJjZWx0eWNrIiwicGFsZXN0ecWEc2siLCJzb21hbGlqc2siKSkNCg0KUEJMX2xpdGVyYXR1cnlfb2JjZSA8LSByYmluZChQQkxfbGl0ZXJhdHVyeV9vYmNlLHJlY3puZSkNCg0KbWFyY19maWVsZF82NTUgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1NSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9saXRlcmF0dXJ5X29iY2UgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikgJT4lDQogIGFycmFuZ2UoaWQsRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjU1JHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1WzFdKSkNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1WyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1JHNhbWUpLF0gJT4lDQogIHNlbGVjdChpZCxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKG1hcmNfZmllbGRfNjAwKSkNCiMjI3ByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5IHogcG9sYSA2NTANCnByemVkbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgbWFyY19maWVsZF82MDAkaWQpICU+JQ0KICBmaWx0ZXIoaWQgJW5vdGluJSBtYXJjX2ZpZWxkXzY1NSRpZCkNCg0KIzY1MA0KbWFyY19maWVsZF82NTAgPC0gcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChpZCxYNjUwKSU+JQ0KICBmaWx0ZXIoWDY1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDY1MD1zdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjUwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlbW92ZV9hbGwoWDY1MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHByemVkbWlvdG93YV9yZWRha3Rvcnp5JFg2NTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjUwPC1jYmluZChtYXJjX2ZpZWxkXzY1MCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1MCRYNjUwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjUwJFg2NTAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjUwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjUwJFg2NTApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1MCRYNjUwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjUwIDwtIG1hcmNfZmllbGRfNjUwICU+JQ0KICBzZWxlY3QoaWQsYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjUwIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTAgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfbGl0ZXJhdHVyeV9vYmNlIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YXx8JyUnKSIpICU+JQ0KICBhcnJhbmdlKGlkLERaX0RaSUFMX0lEKQ0KDQptYXJjX2ZpZWxkXzY1MCRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1MFsxXSkpDQptYXJjX2ZpZWxkXzY1MCA8LSBtYXJjX2ZpZWxkXzY1MFshZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1MCRzYW1lKSxdICU+JQ0KICBzZWxlY3QoaWQsRFpfRFpJQUxfSUQsRFpfTkFaV0EscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIikgJT4lDQogIHNlbGVjdChuYW1lcyhtYXJjX2ZpZWxkXzYwMCkpDQoNCmRvX3ByemVkbWlvdG93ZWoxIDwtIHJiaW5kKG1hcmNfZmllbGRfNjAwLG1hcmNfZmllbGRfNjU1LG1hcmNfZmllbGRfNjUwKQ0KDQojcHJ6eXBpc2FuaWUgbmEgcG9kc3Rhd2llIGRlc2tyeXB0b3LDs3cgdGVtYXR5Y3pueWNoIHogNjUwIGkgNjU1DQp6YXBpc3kgPC0gUkpEQkM6OmRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Qgei56YV96YXBpc19pZCwgZHouZHpfZHppYWxfaWQsIGR6LmR6X25hendhLCByei5yel9yb2R6YWpfaWQsIHJ6LnJ6X25hendhLCB6LnphX3N0YXR1c19pbXAsIHouemFfdXdhZ2kNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBibF96YXBpc3kgeg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gcGJsX2R6aWFseSBkeiBvbiBkei5kel9kemlhbF9pZD16LnphX2R6X2R6aWFsMV9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gcGJsX3JvZHphamVfemFwaXNvdyByeiBvbiByei5yel9yb2R6YWpfaWQ9ei56YV9yel9yb2R6YWoxX2lkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgei56YV91d2FnaSBsaWtlICclaW1wb3J0JSciKSAlPiUNCiAgbXV0YXRlKHByYWNvd25pa19wYmwgPSBzdHJfZXh0cmFjdChaQV9VV0FHSSwgIig/PD1ha2NlcHR1amU6KShbQS1aXSopIikpICU+JQ0KICBzZWxlY3QoLVpBX1VXQUdJKQ0KbmF6d3lfbGl0X29iY3ljaCA8LSBzdHJfcmVwbGFjZV9hbGwocGFzdGUoUEJMX2xpdGVyYXR1cnlfb2JjZSRuYXp3YSxjb2xsYXBzZSA9ICJ8IiksIlxcKCIsIlxcXFwoIikNCnBvcHJ6ZWRuaWVfaW1wb3J0eSA8LSByYmluZChsaXN0eV8yMDA0LGxpc3R5XzIwMDUsbGlzdHlfMjAwNixsaXN0eV8yMDA3LGxpc3R5XzIwMDgpICU+JQ0KICBmdWxsX2pvaW4oLix6YXBpc3ksYnkgPSAiWkFfWkFQSVNfSUQiKSAlPiUNCiAgc2VsZWN0KFpBX1pBUElTX0lELFg2NTAsWDY1NSxEWl9EWklBTF9JRCxEWl9OQVpXQSxSWl9ST0RaQUpfSUQsUlpfTkFaV0EscHJhY293bmlrX3BibCxaQV9TVEFUVVNfSU1QKSAlPiUNCiAgbXV0YXRlKFg2NTAgPSBzdHJfcmVtb3ZlX2FsbChYNjUwLCJcXFxcNyIpLA0KICAgICAgICAgWDY1NSA9IHN0cl9yZW1vdmVfYWxsKFg2NTUsIlxcXFw3IiksDQogICAgICAgICBYNjUwID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFg2NTAsIihcXCRhKSIsIlxcXFwjN1xcMSIpLCIjIiksDQogICAgICAgICBYNjU1ID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFg2NTUsIihcXCRhKSIsIlxcXFwjN1xcMSIpLCIjIikpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKFJaX1JPRFpBSl9JRCAlbm90aW4lIGMoMCwxLDIsMjUwLDc2NCkpICU+JQ0KICBhcnJhbmdlKHByYWNvd25pa19wYmwsRFpfRFpJQUxfSUQpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKG5hend5X2xpdF9vYmN5Y2gsWDY1MCkmIWdyZXBsKG5hend5X2xpdF9vYmN5Y2gsWDY1NSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHByYWNvd25pa19wYmwpKSAlPiUNCiAgZmlsdGVyKFpBX1NUQVRVU19JTVAgJWluJSBjKCJJT0siLCJJUEMiKSkNCg0KI3ByenlwaXNhbmllIG5hIHBvZHN0YXdpZSBjesSZc3RvdGxpd2/Fm2NpIGRlc2tyeXB0b3LDs3cgNjU1DQpwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3ByemVkbWlvdG93ZWoxJGlkKQ0KDQpkZXNrcnlwdG9yeTY1NSA8LSBwb3ByemVkbmllX2ltcG9ydHkgJT4lDQogIHNlbGVjdChYNjU1LHByYWNvd25pa19wYmwsRFpfRFpJQUxfSUQsRFpfTkFaV0EpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKFg2NTUpKSAlPiUNCiAgdW5pdGUoZGF0YT0uLGNvbCA9ICJkZXNrcnlwdG9yNjU1Iiwgc2VwID0gIn4iKQ0KDQpkZXNrcnlwdG9yeTY1NSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRlc2tyeXB0b3J5NjU1JGRlc2tyeXB0b3I2NTUpKSAlPiUNCiAgY1NwbGl0KC4sIlZhcjEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICByZW5hbWUoWDY1NSA9IFZhcjFfMSwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9IFZhcjFfMiwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gVmFyMV8zLA0KICAgICAgICAgRFpfTkFaV0EgPSBWYXIxXzQpICU+JQ0KICBtdXRhdGUoWDY1NSA9IHN0cl9yZW1vdmVfYWxsKFg2NTUsIlxcXFw3XFwkYSIpLA0KICAgICAgICAgWDY1NSA9IHN0cl9yZW1vdmVfYWxsKFg2NTUsIlxcJDJEQk4iKSwNCiAgICAgICAgIFg2NTUgPSBzdHJfcmVwbGFjZV9hbGwoWDY1NSwiXFwkLnxcXHwiLCIgIiksDQogICAgICAgICBYNjU1ID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIiAiLCIuKiIpKSAlPiUNCiAgYXJyYW5nZShYNjU1LC1GcmVxLERaX05BWldBKQ0KDQpkZXNrcnlwdG9yeTY1NSRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoZGVza3J5cHRvcnk2NTVbMl0pKQ0KZGVza3J5cHRvcnk2NTUgPC0gZGVza3J5cHRvcnk2NTVbIWR1cGxpY2F0ZWQoZGVza3J5cHRvcnk2NTUkaWRfZ3J1cHkpLF0gJT4lDQogIHNlbGVjdCgtaWRfZ3J1cHkpICU+JQ0KICBhcnJhbmdlKC1GcmVxKQ0KDQp4IDwtIDE6bGVuZ3RoKGRlc2tyeXB0b3J5NjU1JFg2NTUpDQp0ZXN0IDwtIGRhdGEuZnJhbWUoc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICAgIGRvX3ByemVkbWlvdG93ZWoyIDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICAgICAgbXV0YXRlKHJlZGFrdG9yX2R6aWFsdSA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1NSRYNjU1W2ldLFg2NTUpLGFzLmNoYXJhY3RlcihkZXNrcnlwdG9yeTY1NSRyZWRha3Rvcl9kemlhbHUpW2ldLE5BKSwNCiAgICAgICAgICAgICBpbGUgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTUkWDY1NVtpXSxYNjU1KSxhcy5pbnRlZ2VyKGRlc2tyeXB0b3J5NjU1JEZyZXEpW2ldLE5BKSwNCiAgICAgICAgICAgICBjbyA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1NSRYNjU1W2ldLFg2NTUpLGFzLmNoYXJhY3RlcihkZXNrcnlwdG9yeTY1NSRYNjU1KVtpXSxOQSksDQogICAgICAgICAgICAgRFpfRFpJQUxfSUQgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTUkWDY1NVtpXSxYNjU1KSxhcy5pbnRlZ2VyKGRlc2tyeXB0b3J5NjU1JERaX0RaSUFMX0lEKVtpXSxOQSksDQogICAgICAgICAgICAgRFpfTkFaV0EgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTUkWDY1NVtpXSxYNjU1KSxhcy5jaGFyYWN0ZXIoZGVza3J5cHRvcnk2NTUkRFpfTkFaV0EpW2ldLE5BKSkgJT4lDQogICAgICBmaWx0ZXIoIWlzLm5hKHJlZGFrdG9yX2R6aWFsdSkpDQogICAgaWYgKGxlbmd0aChkb19wcnplZG1pb3Rvd2VqMiRyZWRha3Rvcl9kemlhbHUpPjApIHsNCiAgICAgIHRlc3QgPC0gcmJpbmQodGVzdCxkb19wcnplZG1pb3Rvd2VqMikNCiAgICB9IGVsc2Uge30NCiAgICANCn0NCmNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUodGVzdCRpZCkpDQpkb19wcnplZG1pb3Rvd2VqMiA8LSBtZXJnZSh0ZXN0LGNvdW50LCBieS54ID0gImlkIixieS55ID0gIlZhcjEiKSAlPiUNCiAgbXV0YXRlKGRsdWdvc2MgPSBuY2hhcihjbykpICU+JQ0KICBhcnJhbmdlKC1GcmVxLGlkLC1kbHVnb3NjLC1pbGUpDQoNCmRvX3ByemVkbWlvdG93ZWoyJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChkb19wcnplZG1pb3Rvd2VqMlsxXSkpDQpkb19wcnplZG1pb3Rvd2VqMiA8LSBkb19wcnplZG1pb3Rvd2VqMlshZHVwbGljYXRlZChkb19wcnplZG1pb3Rvd2VqMiRpZF9ncnVweSksXSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fcHJ6ZWRtaW90b3dlajEpKQ0KI3ByenlwaXNhbmllIG5hIHBvZHN0YXdpZSBjesSZc3RvdGxpd2/Fm2NpIGRlc2tyeXB0b3LDs3cgNjUwDQpwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3ByemVkbWlvdG93ZWoxJGlkKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgZG9fcHJ6ZWRtaW90b3dlajIkaWQpDQoNCmRlc2tyeXB0b3J5NjUwIDwtIHBvcHJ6ZWRuaWVfaW1wb3J0eSAlPiUNCiAgc2VsZWN0KFg2NTAscHJhY293bmlrX3BibCxEWl9EWklBTF9JRCxEWl9OQVpXQSkgJT4lDQogIGZpbHRlcighaXMubmEoWDY1MCkpICU+JQ0KICB1bml0ZShkYXRhPS4sY29sID0gImRlc2tyeXB0b3I2NTAiLCBzZXAgPSAifiIpDQoNCmRlc2tyeXB0b3J5NjUwIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGVza3J5cHRvcnk2NTAkZGVza3J5cHRvcjY1MCkpICU+JQ0KICBjU3BsaXQoLiwiVmFyMSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJ3aWRlIikgJT4lDQogIHJlbmFtZShYNjUwID0gVmFyMV8xLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gVmFyMV8yLA0KICAgICAgICAgRFpfRFpJQUxfSUQgPSBWYXIxXzMsDQogICAgICAgICBEWl9OQVpXQSA9IFZhcjFfNCkgJT4lDQogIG11dGF0ZShYNjUwID0gc3RyX3JlbW92ZV9hbGwoWDY1MCwiXFxcXDdcXCRhIiksDQogICAgICAgICBYNjUwID0gc3RyX3JlbW92ZV9hbGwoWDY1MCwiXFwkMkRCTiIpLA0KICAgICAgICAgWDY1MCA9IHN0cl9yZW1vdmVfYWxsKFg2NTAsIlxcXFxcXFxcIiksDQogICAgICAgICBYNjUwID0gc3RyX3JlcGxhY2VfYWxsKFg2NTAsIlxcJC58XFx8IiwiICIpLA0KICAgICAgICAgWDY1MCA9IHN0cl9yZXBsYWNlX2FsbChYNjUwLCIgIiwiLioiKSkgJT4lDQogIGFycmFuZ2UoWDY1MCwtRnJlcSxEWl9OQVpXQSkNCg0KZGVza3J5cHRvcnk2NTAkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGRlc2tyeXB0b3J5NjUwWzJdKSkNCmRlc2tyeXB0b3J5NjUwIDwtIGRlc2tyeXB0b3J5NjUwWyFkdXBsaWNhdGVkKGRlc2tyeXB0b3J5NjUwJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KSAlPiUNCiAgYXJyYW5nZSgtRnJlcSkNCg0KeCA8LSAxOmxlbmd0aChkZXNrcnlwdG9yeTY1MCRYNjUwKQ0KdGVzdCA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgICBkb19wcnplZG1pb3Rvd2VqMyA8LSBwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgICAgIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTAkWDY1MFtpXSxYNjUwKSxhcy5jaGFyYWN0ZXIoZGVza3J5cHRvcnk2NTAkcmVkYWt0b3JfZHppYWx1KVtpXSxOQSksDQogICAgICAgICAgICAgaWxlID0gaWZlbHNlKGdyZXBsKGRlc2tyeXB0b3J5NjUwJFg2NTBbaV0sWDY1MCksYXMuaW50ZWdlcihkZXNrcnlwdG9yeTY1MCRGcmVxKVtpXSxOQSksDQogICAgICAgICAgICAgY28gPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTAkWDY1MFtpXSxYNjUwKSxhcy5jaGFyYWN0ZXIoZGVza3J5cHRvcnk2NTAkWDY1MClbaV0sTkEpLA0KICAgICAgICAgICAgIERaX0RaSUFMX0lEID0gaWZlbHNlKGdyZXBsKGRlc2tyeXB0b3J5NjUwJFg2NTBbaV0sWDY1MCksYXMuaW50ZWdlcihkZXNrcnlwdG9yeTY1MCREWl9EWklBTF9JRClbaV0sTkEpLA0KICAgICAgICAgICAgIERaX05BWldBID0gaWZlbHNlKGdyZXBsKGRlc2tyeXB0b3J5NjUwJFg2NTBbaV0sWDY1MCksYXMuY2hhcmFjdGVyKGRlc2tyeXB0b3J5NjUwJERaX05BWldBKVtpXSxOQSkpICU+JQ0KICAgICAgZmlsdGVyKCFpcy5uYShyZWRha3Rvcl9kemlhbHUpKQ0KICAgIGlmIChsZW5ndGgoZG9fcHJ6ZWRtaW90b3dlajMkcmVkYWt0b3JfZHppYWx1KT4wKSB7DQogICAgICB0ZXN0IDwtIHJiaW5kKHRlc3QsZG9fcHJ6ZWRtaW90b3dlajMpDQogICAgfSBlbHNlIHt9DQogICAgDQp9DQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHRlc3QkaWQpKQ0KZG9fcHJ6ZWRtaW90b3dlajMgPC0gbWVyZ2UodGVzdCxjb3VudCwgYnkueCA9ICJpZCIsYnkueSA9ICJWYXIxIikgJT4lDQogIG11dGF0ZShkbHVnb3NjID0gbmNoYXIoY28pKSAlPiUNCiAgYXJyYW5nZSgtRnJlcSxpZCwtZGx1Z29zYywtaWxlKQ0KDQpkb19wcnplZG1pb3Rvd2VqMyRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoZG9fcHJ6ZWRtaW90b3dlajNbMV0pKQ0KZG9fcHJ6ZWRtaW90b3dlajMgPC0gZG9fcHJ6ZWRtaW90b3dlajNbIWR1cGxpY2F0ZWQoZG9fcHJ6ZWRtaW90b3dlajMkaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3ByemVkbWlvdG93ZWoxKSkNCg0KZG9fcHJ6ZWRtaW90b3dlaiA8LSByYmluZChkb19wcnplZG1pb3Rvd2VqMSxkb19wcnplZG1pb3Rvd2VqMixkb19wcnplZG1pb3Rvd2VqMykNCiNwcnp5cGlzYW5pZSBwcnplZG1pb3Rvd2VqIG5hIHBvZHN0YXdpZSBzxYJvd25pa2EgcG9qxJnEhw0KZG9fcHJ6ZWRtaW90b3dlaiA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGxlZnRfam9pbiguLGRvX3ByemVkbWlvdG93ZWosYnk9ImlkIikgJT4lDQojcHJ6eXBpc2FuaWUgbmEgcG9kc3Rhd2llIHpkZWZpbmlvd2FueWNoIHPFgsOzdyAoZG9waXNhbmllIGRvIGdvdG93ZWdvIHBsaWt1KQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gaWZlbHNlKGlzLm5hKHJlZGFrdG9yX2R6aWFsdSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ0ZWF0ciIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJ0ZWF0ciIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJNQVJUQUsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoImZpbG0iLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiZmlsbSIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJPTEEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgidGVsZXdpemoiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgidGVsZXdpemoiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiRVdBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJyYWRpbyIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJyYWRpbyIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJFV0EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJjemFzb3Bpc20iLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiY3phc29waXNtIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIlRPTUFTWiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3eWRhd25pY3R3IixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInd5ZGF3bmljdHciLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiQkFSQkFSQVciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIm9kIDE5ODkiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgib2QgMTk4OSIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJQQVVMSU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgixId3aWN6ZXx6YWRhbnxzemtvxYJ8c3prw7PFgnxzY2VuYXJpdXN6fHphasSZxId8cG9tb2NuaWN6IixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoIsSHd2ljemV8emFkYW58c3prb8WCfHN6a8OzxYJ8c2NlbmFyaXVzenx6YWrEmcSHfHBvbW9jbmljeiIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJLQVJPTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJzY2VuaWN6biIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJzY2VuaWN6biIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJNQVJUQUsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInRlb3JpYXxzb2Nqb2xvZ2lhfGFudHJvcG9sb2dpYXxtZXRhZml6eWt8aW50ZXJwcmV0YWN8Zmlsb3pvZiIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJ0ZW9yaWF8c29jam9sb2dpYXxhbnRyb3BvbG9naWF8bWV0YWZpenlrfGludGVycHJldGFjfGZpbG96b2YiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoImx1ZG93fHp3eWN6fG9ieWN6fGZvbGtsIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoImx1ZG93fHp3eWN6fG9ieWN6fGZvbGtsIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIkFOSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgia2F0b2xpY3xiaWJsaWF8YmlibGlqfGtvxZtjacOzxYIiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgia2F0b2xpY3xiaWJsaWF8YmlibGlqfGtvxZtjacOzxYIiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiQkVBVEFTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJkcnVrfHLEmWtvcGl8aW5rdW5hYnxpbndlbnR8YmlibGlvZ3J8c8WCb3duaWt8YmlibGlvdGVrIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoImRydWt8csSZa29waXxpbmt1bmFifGlud2VudHxiaWJsaW9ncnxzxYJvd25pa3xiaWJsaW90ZWsiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiSVpBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiemFiYXdrfGR6aWVjIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInphYmF3a3xkemllYyIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJCQVJCQVJBVyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ0ZW1hdHlrYXwyMC0yMSB3LnwyMSB3LiIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJ0ZW1hdHlrYXwyMC0yMSB3LnwyMSB3LiIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJQQVVMSU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIxOXwxOHwxN3wxNnwxNXwxNHwxMyIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCIxOXwxOHwxN3wxNnwxNXwxNHwxMyIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJHT1NJQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInBvbGl0eWsiLFg2NTUsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJwb2xpdHlrIixYNjUwLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKSwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJoaXN0b3JpYSIsWDY1NSxYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoImhpc3RvcmlhIixYNjUwLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKSwiR09TSUEiLE5BKSkpKSkpKSkpKSkpKSkpKSkpLGFzLmNoYXJhY3RlcihyZWRha3Rvcl9kemlhbHUpKSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IGlmZWxzZShpcy5uYShSWl9ST0RaQUpfSUQpLDIxLGFzLmludGVnZXIoUlpfUk9EWkFKX0lEKSksDQogICAgICAgICBSWl9OQVpXQSA9IGlmZWxzZShpcy5uYShSWl9OQVpXQSksImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iLGFzLmNoYXJhY3RlcihSWl9OQVpXQSkpKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3ByemVkbWlvdG93ZWoxKSkgJT4lDQogIGZpbHRlcighaXMubmEocmVkYWt0b3JfZHppYWx1KSkNCiN3eWRvYnljaWUgemJpb3J1LCBrdMOzcnkgY2nEhWdsZSBuaWUgbWEgcHJ6eXBpc2FueWNoIHJlZGFrdG9yw7N3IGRvIHByemVkbWlvdG93ZWoNCnByemVkbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgZG9fcHJ6ZWRtaW90b3dlaiRpZCkNCiNkbGEga3NpxIXFvGVrLCBrdMOzcmUgbWFqxIUga2lsa3UgYXV0b3LDs3cgdyBvc29iYV9ibl90ZW1hdCAtIHByenlwaXNhbmllIGRvIHJlZGFrdG9yYSBwb3dzemVjaG5laiAtIEJFQVRBRD8NCmRvX3ByemVkbWlvdG93ZWo0IDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9zb2JhX2JuX3RlbWF0KSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBEWl9EWklBTF9JRCA9IE5BLA0KICAgICAgICAgRFpfTkFaV0EgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIsDQogICAgICAgICByZWRha3Rvcl9kemlhbHUgPSAiQkVBVEFEIikgJT4lDQogIHNlbGVjdChuYW1lcyhkb19wcnplZG1pb3Rvd2VqMSkpDQojZGxhIGtzacSFxbxlaywga3TDs3JlIG5pZSBtYWrEhSB3eXBlxYJuaW9uZWdvIG9zb2JhX2JuX2F1dG9yIC0gcHJ6eXBpc2FuaWUgZG8gTWFydHkgeiB4PyBjenkgbG9zb3dvIGRvIGtvZ2/Fmz8NCmRvX3ByemVkbWlvdG93ZWo1IDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBmaWx0ZXIoaXMubmEob3NvYmFfYm5fYXV0b3IpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gTkEsDQogICAgICAgICBEWl9OQVpXQSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIiwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9ICJNQVJUQUt4IikgJT4lDQogIHNlbGVjdChuYW1lcyhkb19wcnplZG1pb3Rvd2VqMSkpDQojcG/FgmFjemVuaWUgd3N6eXN0a2ljaCBwcnplZG1pb3Rvd3ljaCB6IHByenlwaXNhbnltaSByZWRha3RvcmFtaSB3IGplZGVuIHBsaWsNCmRvX3ByemVkbWlvdG93ZWogPC0gcmJpbmQoZG9fcHJ6ZWRtaW90b3dlaixkb19wcnplZG1pb3Rvd2VqNCxkb19wcnplZG1pb3Rvd2VqNSkNCiNkbGEga3NpxIXFvGVrLCBrdMOzcmUgbWFqxIUgd3lwZcWCbmlvbmUgb3NvYmFfYm5fYXV0b3IgLSB6bWlhbmEgbmEgcG9kbWlvdG93xIUgZG8gcsSZY3puZWdvIHByemVqcnplbmlhIGkgcHJ6eXBpc2FuaWUgcmVkYWt0b3LDs3cNCiMjI3ByenlwaXNhbmllIGRvIHBvZG1pb3Rvd2VqISEhISEhISEhISEhISEhISEhISMjIyMjIyMjIyMjIyMjIw0KZG9fcG9kbWlvdG93ZWoxIDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9zb2JhX2JuX2F1dG9yKSkNCiN0cnplYmEgemFrdHVhbGl6b3dhxIcgdyBibl9vaywgxbxlIHRlcmF6IHRvIHPEhSBwb2RtaW90b3dlDQojbGlzdGEgcmVrb3Jkw7N3IGRvIHByemVwaXNhbmlhIHogcHJ6ZWRtaW90b3dlaiBuYSBwb2RtaW90b3fEhQ0KbGlzdGFfZG9fcHJ6ZXBpc2FuaWEgPC0gZG9fcG9kbWlvdG93ZWoxJGlkDQpibl9vayRyb2R6YWpfa3NpYXpraVtibl9vayRpZCAlaW4lIGxpc3RhX2RvX3ByemVwaXNhbmlhXSA8LSAicG9kbWlvdG93YSINCiNwcnpldHdvcnplbmllIGNhxYJlaiBwb2RtaW90b3dlaiAoYm8gcGxpayBkb19wb2RtaW90b3dlajEganXFvCBqZXN0IHcgxZtyb2RrdSkNCiNwcnp5cGlzYW5pZSBwb2RtaW90b3dlaiBhbm9uaW1vd2VqDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiJlgxMDA9PSIiKQ0KDQojNjU1DQptYXJjX2ZpZWxkXzY1NSA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChpZCxYNjU1KSU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVwbGFjZV9hbGwoWDY1NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjU1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2NTUhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTU9c3RyX3JlbW92ZV9hbGwoWDY1NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYNjU1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjU1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1NTwtY2JpbmQobWFyY19maWVsZF82NTUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTUkWDY1NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1NSRYNjU1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1NSRYNjU1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTUkWDY1NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBtYXJjX2ZpZWxkXzY1NSAlPiUNCiAgc2VsZWN0KGlkLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KdHJpbSA8LSBmdW5jdGlvbiAoeCkgZ3N1YigiXlxccyt8XFxzKyQiLCAiIiwgeCkNClBCTF9saXRlcmF0dXJ5X2Fub25pbW93ZSA8LSBQQkxfZHppYWx5X3BhdGggJT4lDQogIGZpbHRlcihncmVwbCgiVXR3b3J5IGFub25pbSIsRFpfTkFaV0EpKSAlPiUNCiAgc2VsZWN0KERaX0RaSUFMX0lELERaX05BWldBLE5BRF9OQURfRFpfRFpJQUxfSUQpICU+JQ0KICBsZWZ0X2pvaW4oLixyZWRha3Rvcnp5X2R6aWFsb3csYnkgPSBjKCJOQURfTkFEX0RaX0RaSUFMX0lEIj0iRFpfRFpJQUxfSUQiKSkgJT4lDQogIHNlbGVjdCgxLERaX05BWldBID0gMiw1KSAlPiUNCiAgZmlsdGVyKERaX0RaSUFMX0lEICVub3RpbiUgYygxOTIyLDE5ODMpKSAlPiUNCiAgZ3JvdXBfYnkoRFpfRFpJQUxfSUQpICU+JQ0KICBtdXRhdGUobmF6d2EgPSBwYXN0ZSh0cmltKHVubGlzdChzdHJfZXh0cmFjdF9hbGwoRFpfTkFaV0EsIig/PD1cXCgpKC4qPykoPz1cXCh8XFwpKSIpKSksY29sbGFwc2UgPSAifCIpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfcmVtb3ZlX2FsbChuYXp3YSwiKC4pKD89XFx8fCQpIiksDQogICAgICAgICBuYXp3YSA9IHN0cl9yZW1vdmUobmF6d2EsImxpdGVyYXR1ci4gIiksDQogICAgICAgICBuYXp3YSA9IGlmZWxzZShuYXp3YT09IiIsInBvbHNrIixhcy5jaGFyYWN0ZXIobmF6d2EpKSwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9IGlmZWxzZShpcy5uYShyZWRha3Rvcl9kemlhbHUpLCJBTklBIixhcy5jaGFyYWN0ZXIocmVkYWt0b3JfZHppYWx1KSkpICU+JQ0KICB1bmdyb3VwKCkNCg0KcmVjem5lIDwtIGRhdGEuZnJhbWUoRFpfRFpJQUxfSUQgPSBjKDg5OSw2OTQsNjk0LDExNzQsMTQ1LDEyMjApLERaX05BWldBID0gYygiVXR3b3J5IGFub25pbW93ZSAoSW5kaWkpIiwiVXR3b3J5IGFub25pbW93ZSAoYnJ5dHlqc2thIGkgaXJsYW5kemthKSIsIlV0d29yeSBhbm9uaW1vd2UgKGJyeXR5anNrYSBpIGlybGFuZHprYSkiLCJVdHdvcnkgYW5vbmltb3dlIChzdGFyb3PFgm93aWHFhHNrYSkiLCJVdHdvcnkgYW5vbmltb3dlIGkgdWxvdG5lIiwiVXR3b3J5IGFub25pbW93ZSAodHVyZWNrYSkiKSwgcmVkYWt0b3JfZHppYWx1ID0gYygiRVdBIiwiQkVBVEFLIiwiQkVBVEFLIiwiQkVBVEFEIiwiQU5JQSIsIkVXQSIpLCBuYXp3YSA9IGMoImluZHlqc2siLCJ3YWxpanNrIiwiYW5naWVsc2siLCJzdGFyb3J1c2siLCJrYXN6dWJzayIsIm5vZ2Fqc2siKSkNCg0KUEJMX2xpdGVyYXR1cnlfYW5vbmltb3dlIDwtIHJiaW5kKFBCTF9saXRlcmF0dXJ5X2Fub25pbW93ZSxyZWN6bmUpDQoNCm1hcmNfZmllbGRfNjU1IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTUgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfbGl0ZXJhdHVyeV9hbm9uaW1vd2UgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikgJT4lDQogIGFycmFuZ2UoaWQsRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjU1JHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1WzFdKSkNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1WyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1JHNhbWUpLF0gJT4lDQogIHNlbGVjdChpZCxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKG1hcmNfZmllbGRfNjAwKSkNCiMjI3ByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IGxpdGVyYXR1cnkgYW5vbmltb3dlaiBuYSBwb2RzdGF3aWUgbGl0ZXJhdHVyeSB6IHBvbGEgNjUwDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiJlgxMDA9PSIiKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgbWFyY19maWVsZF82NTUkaWQpDQoNCiM2NTANCm1hcmNfZmllbGRfNjUwIDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KGlkLFg2NTApJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDY1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDY1MD1zdHJfcmVtb3ZlX2FsbChYNjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2NTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwocG9kbWlvdG93YV9yZWRha3Rvcnp5JFg2NTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjUwPC1jYmluZChtYXJjX2ZpZWxkXzY1MCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1MCRYNjUwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjUwJFg2NTAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjUwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjUwJFg2NTApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1MCRYNjUwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjUwIDwtIG1hcmNfZmllbGRfNjUwICU+JQ0KICBzZWxlY3QoaWQsYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjUwIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTAgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfbGl0ZXJhdHVyeV9hbm9uaW1vd2UgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikgJT4lDQogIGFycmFuZ2UoaWQsRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjUwJHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwWzFdKSkNCm1hcmNfZmllbGRfNjUwIDwtIG1hcmNfZmllbGRfNjUwWyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwJHNhbWUpLF0gJT4lDQogIHNlbGVjdChpZCxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKG1hcmNfZmllbGRfNjAwKSkNCmRvX3BvZG1pb3Rvd2VqMSA8LSByYmluZChtYXJjX2ZpZWxkXzY1NSxtYXJjX2ZpZWxkXzY1MCkNCiNjbyB6cm9iacSHIHogcG96b3N0YcWCeW1pIHBvZG1pb3Rvd3ltaSBhbm9uaW1vd3ltaSwga3TDs3J5Y2ggbmllIHVkYcWCbyBzacSZIHByenlwaXNhxIc/DQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiJlgxMDA9PSIiKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgZG9fcG9kbWlvdG93ZWoxJGlkKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gTkEsDQogICAgICAgICBEWl9OQVpXQSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIiwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9ICJLQVJPTElOQSIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fcHJ6ZWRtaW90b3dlajEpKQ0KZG9fcG9kbWlvdG93ZWoxIDwtIHJiaW5kKGRvX3BvZG1pb3Rvd2VqMSxwb2RtaW90b3dhX3JlZGFrdG9yenkpDQojIyNwcnp5cGlzYW5pZSByZWRha3RvcmEgbmEgcG9kc3Rhd2llIG9zb2J5IHogMTAwIGpha28gdHfDs3JjeSAoYXV0b3JhKSAtIGtzacSFxbxraSB0d8OzcmN5DQojMTAwDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgZG9fcG9kbWlvdG93ZWoxJGlkKQ0KDQptYXJjX2ZpZWxkXzEwMCA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChpZCxYMTAwKSU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8xMDAgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChpZCxgJGFgLGAkZGAsYCRjYCkgJT4lDQogIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KICBzZWxlY3QoaWQsbmFtZSkgJT4lDQogIG11dGF0ZShuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwiKFxcKSkoXFwuJCkiLCJcXDEiKSwNCiAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkgJT4lDQogIGdyb3VwX2J5KGlkKSAlPiUNCiAgbXV0YXRlKG5hbWUgPSBwYXN0ZShuYW1lLGNvbGxhcHNlID0gInwiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkNCg0KZG9fcG9kbWlvdG93ZWoyIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgaW5uZXJfam9pbiguLHBibF92aWFmLGJ5ID0gYygibmFtZSIgPSAiQk5fbmFtZSIpKSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX3R3b3JjeSxieSA9IGMoInBibF9pZCI9IlRXX1RXT1JDQV9JRCIpKSAlPiUNCiAgbGVmdF9qb2luKC4scmVkYWt0b3J6eV9kemlhbG93LGJ5ID0gYygiVFdfRFpfRFpJQUxfSUQiPSJEWl9EWklBTF9JRCIpKSAlPiUNCiAgc2VsZWN0KGlkLFRXX1RXT1JDQV9JRD1wYmxfaWQsVFdfTkFaV0lTS08sVFdfSU1JRSxEWl9EWklBTF9JRD1UV19EWl9EWklBTF9JRCxEWl9OQVpXQT1EWl9OQVpXQS54LHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIikgJT4lDQogIHVuaXF1ZSgpDQoNCiMjI3ByenlwaXNhbmllIGF1dG9yw7N3IHBvZG1pb3Rvd2VqIGRvIGxpdGVyYXR1ciBpIHByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBrb2R1IGxpdGVyYXR1cnkgeiBwb2xhIFgwODAgaSB0d29yemVuaWUgbm93eWNoIHR3w7NyY8OzdyBuYSBwb2RzdGF3aWUgcG9sYSAxMDANCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSIpICU+JQ0KICBmaWx0ZXIoaWQgJW5vdGluJSBkb19wb2RtaW90b3dlajEkaWQpICU+JQ0KICBmaWx0ZXIoaWQgJW5vdGluJSBkb19wb2RtaW90b3dlajIkaWQpDQoNCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbiBCTl9QQkxfbGlzdGFfbGl0ZXJhdHVyIGIgb24gYS5YMDgwIGxpa2UgKCclJ3x8Yi51a2Rfb2dvbG5lfHwnJScpIikNCg0KIyMjZG9kYXdhbmllIG5hemV3bmljdHcgbm93eWNoIHR3w7NyY8Ozdw0KIzEwMA0KbWFyY19maWVsZF8xMDAgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoaWQsWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwb2RtaW90b3dhX3JlZGFrdG9yenkkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF8xMDAgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChpZCxgJGFgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpKSAlPiUNCiAgZ3JvdXBfYnkoaWQpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGAkYWAsY29sbGFwc2UgPSAifCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKFRXX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCBzdHJfcmVwbGFjZV9hbGwoc3RyX3JlbW92ZV9hbGwoYCRhYCwiLCIpLCJcXHwiLCIsICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihgJGFgKSkpLA0KICAgICAgICAgVFdfSU1JRSA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwiKiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpKSkgJT4lDQogIHNlbGVjdChpZCxUV19OQVpXSVNLTyxUV19JTUlFKQ0KI2pvaW4gbmEgcG9kc3Rhd2llIGlkZW50eWN6bmVnbyBpZA0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8xMDAsYnk9ImlkIikgJT4lDQogIG11dGF0ZShwYmxfbmF6d2EgPSBhcy5jaGFyYWN0ZXIocGJsX25hendhKSkgJT4lDQogIG11dGF0ZShEWl9EWklBTF9JRCA9IGlmZWxzZShuYXp3YV9wcm9zdGE9PSJwb2xzayImc3Vic3RyKHBibF9uYXp3YSxuY2hhcihwYmxfbmF6d2EpLG5jaGFyKHBibF9uYXp3YSkpIT1zdWJzdHIoVFdfTkFaV0lTS08sMSwxKSxOQSxhcy5pbnRlZ2VyKHBibF9pZCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBhcnJhbmdlKGlkLERaX0RaSUFMX0lEKQ0KDQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRpZCkpDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gbWVyZ2UocG9kbWlvdG93YV9yZWRha3Rvcnp5LGNvdW50LGJ5LnggPSAiaWQiLGJ5LnkgPSAiVmFyMSIpICU+JQ0KICBtdXRhdGUoZGx1Z29zYyA9IG5jaGFyKHVrZF9vZ29sbmUpKSAlPiUNCiAgYXJyYW5nZSgtRnJlcSxpZCwtZGx1Z29zYyxwYmxfaWQpDQpwb2RtaW90b3dhX3JlZGFrdG9yenkkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQocG9kbWlvdG93YV9yZWRha3Rvcnp5WzFdKSkNCmRvX3BvZG1pb3Rvd2VqMyA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenlbIWR1cGxpY2F0ZWQocG9kbWlvdG93YV9yZWRha3Rvcnp5JHNhbWUpLF0gJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSkgJT4lDQogIHJlbmFtZShEWl9OQVpXQSA9IHBibF9uYXp3YSkgJT4lDQogIHNlbGVjdChpZCxUV19UV09SQ0FfSUQsVFdfTkFaV0lTS08sVFdfSU1JRSxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUoUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpDQoNCiMjI3ByenlwaXNhbmllIGF1dG9yw7N3IHBvZG1pb3Rvd2VqIGRvIGxpdGVyYXR1ciBpIHByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5IHogcG9sYSA2NTUgaSB0d29yemVuaWUgbm93eWNoIHR3w7NyY8OzdyBuYSBwb2RzdGF3aWUgcG9sYSAxMDANCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSIpICU+JQ0KICBmaWx0ZXIoaWQgJW5vdGluJSBkb19wb2RtaW90b3dlajEkaWQpICU+JQ0KICBmaWx0ZXIoaWQgJW5vdGluJSBkb19wb2RtaW90b3dlajIkaWQpICU+JQ0KICBmaWx0ZXIoaWQgJW5vdGluJSBkb19wb2RtaW90b3dlajMkaWQpDQoNCiM2NTUNCm1hcmNfZmllbGRfNjU1IDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KGlkLFg2NTUpJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVtb3ZlX2FsbChYNjU1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwocG9kbWlvdG93YV9yZWRha3Rvcnp5JFg2NTUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjU1PC1jYmluZChtYXJjX2ZpZWxkXzY1NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1NSRYNjU1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjU1JFg2NTUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjU1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjU1JFg2NTUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1NSRYNjU1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1ICU+JQ0KICBzZWxlY3QoaWQsYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjU1IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTUgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfaGFzbGFfb3NvYm93ZSBiIG9uIGEuYCRhYCBsaWtlICgnJSd8fGIubmF6d2F8fCclJykiKQ0KDQojIyNkb2Rhd2FuaWUgbmF6ZXduaWN0dyBub3d5Y2ggdHfDs3Jjw7N3DQojMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChpZCxYMTAwKSU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzEwMCA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiAgc2VsZWN0KGlkLGAkYWApICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIig/PD1bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIikpICU+JQ0KICBncm91cF9ieShpZCkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoYCRhYCxjb2xsYXBzZSA9ICJ8IikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoVFdfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVtb3ZlX2FsbChgJGFgLCIsIiksIlxcfCIsIiwgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKGAkYWApKSksDQogICAgICAgICBUV19JTUlFID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCIqIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMyIpLCIqIikpKSAlPiUNCiAgc2VsZWN0KGlkLFRXX05BWldJU0tPLFRXX0lNSUUpDQojam9pbiBuYSBwb2RzdGF3aWUgaWRlbnR5Y3puZWdvIGlkDQptYXJjX2ZpZWxkXzY1NSA8LSBtYXJjX2ZpZWxkXzY1NSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8xMDAsYnk9ImlkIikgJT4lDQogIG11dGF0ZShEWl9EWklBTF9JRCA9IGlmZWxzZShuYXp3YT09InBvbHNrIiZzdWJzdHIoRFpfTkFaV0EsbmNoYXIoRFpfTkFaV0EpLG5jaGFyKERaX05BWldBKSkhPXN1YnN0cihUV19OQVpXSVNLTywxLDEpLE5BLGFzLmludGVnZXIoRFpfRFpJQUxfSUQpKSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgYXJyYW5nZShpZCxEWl9EWklBTF9JRCkNCiAgICANCm1hcmNfZmllbGRfNjU1JHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1WzFdKSkNCmRvX3BvZG1pb3Rvd2VqNCA8LSBtYXJjX2ZpZWxkXzY1NVshZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1NSRzYW1lKSxdICU+JQ0KICBzZWxlY3QoaWQsRFpfRFpJQUxfSUQsRFpfTkFaV0EsVFdfTkFaV0lTS08sVFdfSU1JRSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiKSAlPiUNCiAgc2VsZWN0KG5hbWVzKG1hcmNfZmllbGRfNjAwKSkNCg0KIyMjcHJ6eXBpc2FuaWUgYXV0b3LDs3cgcG9kbWlvdG93ZWogZG8gbGl0ZXJhdHVyIGkgcHJ6eXBpc2FuaWUgZG8gcmVkYWt0b3LDs3cgbmEgcG9kc3Rhd2llIGxpdGVyYXR1cnkgeiBwb2xhIDY1NSBpIHR3b3J6ZW5pZSBub3d5Y2ggdHfDs3Jjw7N3IG5hIHBvZHN0YXdpZSBwb2xhIDEwMA0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRpZCkgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMiRpZCkgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMyRpZCkgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNCRpZCkNCg0KIzY1MA0KbWFyY19maWVsZF82NTAgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoaWQsWDY1MCklPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlcGxhY2VfYWxsKFg2NTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZW1vdmVfYWxsKFg2NTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwb2RtaW90b3dhX3JlZGFrdG9yenkkWDY1MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzY1MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82NTA8LWNiaW5kKG1hcmNfZmllbGRfNjUwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjUwJFg2NTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82NTAkWDY1MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82NTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTAkWDY1MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjUwJFg2NTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF82NTAgPC0gbWFyY19maWVsZF82NTAgJT4lDQogIHNlbGVjdChpZCxgJGFgKSAlPiUNCiAgdW5pcXVlKCkNCg0KbWFyY19maWVsZF82NTAgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1MCBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9oYXNsYV9vc29ib3dlIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YXx8JyUnKSIpICAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8xMDAsYnk9ImlkIikgJT4lDQogIG11dGF0ZShEWl9EWklBTF9JRCA9IGlmZWxzZShuYXp3YT09InBvbHNrIiZzdWJzdHIoRFpfTkFaV0EsbmNoYXIoRFpfTkFaV0EpLG5jaGFyKERaX05BWldBKSkhPXN1YnN0cihUV19OQVpXSVNLTywxLDEpLE5BLGFzLmludGVnZXIoRFpfRFpJQUxfSUQpKSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgYXJyYW5nZShpZCxEWl9EWklBTF9JRCkNCg0KbWFyY19maWVsZF82NTAkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTBbMV0pKQ0KZG9fcG9kbWlvdG93ZWo1IDwtIG1hcmNfZmllbGRfNjUwWyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwJHNhbWUpLF0gJT4lDQogIHNlbGVjdChpZCxEWl9EWklBTF9JRCxEWl9OQVpXQSxUV19OQVpXSVNLTyxUV19JTUlFLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpICU+JQ0KICBzZWxlY3QobmFtZXMobWFyY19maWVsZF82MDApKQ0KI2NvIHpvc3RhxYJvIGRvIHBvZG1pb3Rvd2VqPw0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRpZCkgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMiRpZCkgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMyRpZCkgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNCRpZCkgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNSRpZCkNCiNuYWRkYXRlayBwcnp5cGlzYcSHIEthcm9saW5pZSBqYWtvIHBvZG1pb3Rvd8SFIGJleiB0d8OzcmPDs3cgaSBjenlfYXV0b21hdHljem5pZSA8LSBuaWUNCmRvX3BvZG1pb3Rvd2VqNiA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBEWl9EWklBTF9JRCA9IE5BLA0KICAgICAgICAgRFpfTkFaV0EgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gIktBUk9MSU5BIikgJT4lDQogIHNlbGVjdChuYW1lcyhkb19wb2RtaW90b3dlajUpKQ0KI3RyemViYSB6YWt0dWFsaXpvd2HEhyB3IGJuX29rLCDFvGUgdGVyYXogdG8gbmllIHPEhSBhdXRvbWF0eWN6bmUNCmxpc3RhX2RvX3ByemVwaXNhbmlhIDwtIGRvX3BvZG1pb3Rvd2VqNiRpZA0KYm5fb2skY3p5X2F1dG9tYXR5Y3puaWVbYm5fb2skaWQgJWluJSBsaXN0YV9kb19wcnplcGlzYW5pYV0gPC0gIm5pZSINCiNwb8WCxIVjemVuaWUgcHJ6eWR6aWHFgnUgcG9kbWlvdG93eWNoIHcgamVkZW4gcGxpaw0KZG9fcG9kbWlvdG93ZWogPC0gcmJpbmQoZG9fcG9kbWlvdG93ZWoxLGRvX3BvZG1pb3Rvd2VqMixkb19wb2RtaW90b3dlajMsZG9fcG9kbWlvdG93ZWo0LGRvX3BvZG1pb3Rvd2VqNSxkb19wb2RtaW90b3dlajYpDQoNCiNwcnp5cGlzYW5pZSBhbnRvbG9naWkgZG8gVG9ta2EgaSBkbyBsaXRlcmF0dXIgbmEgcG9kc3Rhd2llIDA4MA0KYW50b2xvZ2llX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraSA9PSAiYW50b2xvZ2lhIikNClBCTF9kemlhbHlfYW50b2xvZ2llIDwtIFBCTF9kemlhbHlfcGF0aCAlPiUNCiAgZmlsdGVyKGdyZXBsKCJhbnRvbG9nIixEWl9OQVpXQSxpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUNCiAgbGVmdF9qb2luKC4scmVkYWt0b3J6eV9kemlhbG93LGJ5PSJEWl9EWklBTF9JRCIpICU+JQ0KICBzZWxlY3QoRFpfRFpJQUxfSUQsRFpfTkFaV0E9RFpfTkFaV0EueCxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gaWZlbHNlKGlzLm5hKHJlZGFrdG9yX2R6aWFsdSksIlRPTUFTWiIsYXMuY2hhcmFjdGVyKHJlZGFrdG9yX2R6aWFsdSkpKQ0KDQpQQkxfZHppYWx5X2FudG9sb2dpZSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIFBCTF9kemlhbHlfYW50b2xvZ2llIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gQk5fUEJMX2xpc3RhX2xpdGVyYXR1ciBiIG9uIGEuRFpfTkFaV0EgbGlrZSAoJyUnfHxiLm5hendhX3Byb3N0YXx8JyUnKSIpICU+JQ0KICBtdXRhdGUodWtkX29nb2xuZSA9IGlmZWxzZShEWl9EWklBTF9JRD09MTQ2LCI4MjEuMTYyLjEiLGFzLmNoYXJhY3Rlcih1a2Rfb2dvbG5lKSksDQogICAgICAgICBuYXp3YV9wcm9zdGEgPSBpZmVsc2UoRFpfRFpJQUxfSUQ9PTE0NiwicG9sc2siLGFzLmNoYXJhY3RlcihuYXp3YV9wcm9zdGEpKSkgJT4lDQogIGZpbHRlcighaXMubmEodWtkX29nb2xuZSkpICU+JQ0KICBmaWx0ZXIoRFpfRFpJQUxfSUQhPTc0NCkgJT4lDQogIHNlbGVjdCgxOjUpIA0KDQphbnRvbG9naWVfcmVkYWt0b3J6eSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGFudG9sb2dpZV9yZWRha3Rvcnp5IGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIFBCTF9kemlhbHlfYW50b2xvZ2llIGIgb24gYS5YMDgwIGxpa2UgKCclJ3x8Yi51a2Rfb2dvbG5lfHwnJScpIikNCg0KY291bnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShhbnRvbG9naWVfcmVkYWt0b3J6eSRpZCkpDQphbnRvbG9naWVfcmVkYWt0b3J6eSA8LSBtZXJnZShhbnRvbG9naWVfcmVkYWt0b3J6eSxjb3VudCxieS54ID0gImlkIixieS55ID0gIlZhcjEiKSAlPiUNCiAgbXV0YXRlKGRsdWdvc2MgPSBuY2hhcih1a2Rfb2dvbG5lKSkgJT4lDQogIGFycmFuZ2UoLUZyZXEsaWQsLWRsdWdvc2MsRFpfRFpJQUxfSUQpDQphbnRvbG9naWVfcmVkYWt0b3J6eSRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChhbnRvbG9naWVfcmVkYWt0b3J6eVsxXSkpDQpkb19hbnRvbG9naWkxIDwtIGFudG9sb2dpZV9yZWRha3Rvcnp5WyFkdXBsaWNhdGVkKGFudG9sb2dpZV9yZWRha3Rvcnp5JHNhbWUpLF0gJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEpICU+JQ0KICBzZWxlY3QoaWQsVFdfVFdPUkNBX0lELFRXX05BWldJU0tPLFRXX0lNSUUsRFpfRFpJQUxfSUQsRFpfTkFaV0EscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgbXV0YXRlKFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpDQojcHJ6eXBpc2FuaWUgYW50b2xvZ2lpIGRvIFRvbWthIGkgZG8gbGl0ZXJhdHVyIG5hIHBvZHN0YXdpZSA2NjUNCmFudG9sb2dpZV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2kgPT0gImFudG9sb2dpYSIpICU+JQ0KICBmaWx0ZXIoaWQgJW5vdGluJSBkb19hbnRvbG9naWkxJGlkKQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBhbnRvbG9naWVfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KGlkLFg2NTUpJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVtb3ZlX2FsbChYNjU1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoYW50b2xvZ2llX3JlZGFrdG9yenkkWDY1NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzY1NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82NTU8LWNiaW5kKG1hcmNfZmllbGRfNjU1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjU1JFg2NTUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82NTUkWDY1NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82NTVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTUkWDY1NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjU1JFg2NTUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF82NTUgPC0gbWFyY19maWVsZF82NTUgJT4lDQogIHNlbGVjdChpZCxgJGFgKSAlPiUNCiAgdW5pcXVlKCkNCg0KbWFyY19maWVsZF82NTUgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1NSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9kemlhbHlfYW50b2xvZ2llIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YV9wcm9zdGF8fCclJykiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBhcnJhbmdlKGlkLERaX0RaSUFMX0lEKQ0KDQptYXJjX2ZpZWxkXzY1NSRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1NVsxXSkpDQpkb19hbnRvbG9naWkyIDwtIG1hcmNfZmllbGRfNjU1WyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1JHNhbWUpLF0gJT4lDQogIHNlbGVjdChpZCxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX2FudG9sb2dpaTEpKQ0KI3ByenlwaXNhbmllIGFudG9sb2dpaSBkbyBUb21rYSBpIGRvIGxpdGVyYXR1ciBuYSBwb2RzdGF3aWUgNjY1DQphbnRvbG9naWVfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpID09ICJhbnRvbG9naWEiKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgZG9fYW50b2xvZ2lpMSRpZCkgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX2FudG9sb2dpaTIkaWQpDQoNCm1hcmNfZmllbGRfNjUwIDwtIGFudG9sb2dpZV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoaWQsWDY1MCklPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlcGxhY2VfYWxsKFg2NTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZW1vdmVfYWxsKFg2NTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChhbnRvbG9naWVfcmVkYWt0b3J6eSRYNjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1MDwtY2JpbmQobWFyY19maWVsZF82NTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTAkWDY1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1MCRYNjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1MCRYNjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTAkWDY1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBtYXJjX2ZpZWxkXzY1MCAlPiUNCiAgc2VsZWN0KGlkLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcmNfZmllbGRfNjUwIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gUEJMX2R6aWFseV9hbnRvbG9naWUgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhX3Byb3N0YXx8JyUnKSIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIGFycmFuZ2UoaWQsRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjUwJHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwWzFdKSkNCmRvX2FudG9sb2dpaTMgPC0gbWFyY19maWVsZF82NTBbIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTAkc2FtZSksXSAlPiUNCiAgc2VsZWN0KGlkLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fYW50b2xvZ2lpMSkpDQojcmVzenRhIGFudG9sb2dpaSBiZXogZHppYcWCdSBwbyBwcm9zdHUgcHJ6eXBpc2FuYSBkbyBUb21rYQ0KYW50b2xvZ2llX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraSA9PSAiYW50b2xvZ2lhIikgJT4lDQogIGZpbHRlcihpZCAlbm90aW4lIGRvX2FudG9sb2dpaTEkaWQpICU+JQ0KICBmaWx0ZXIoaWQgJW5vdGluJSBkb19hbnRvbG9naWkyJGlkKSAlPiUNCiAgZmlsdGVyKGlkICVub3RpbiUgZG9fYW50b2xvZ2lpMyRpZCkNCg0KZG9fYW50b2xvZ2lpNCA8LSBhbnRvbG9naWVfcmVkYWt0b3J6eSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gTkEsDQogICAgICAgICBEWl9OQVpXQSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIiwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9ICJUT01BU1oiKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX2FudG9sb2dpaTEpKQ0KDQpkb19hbnRvbG9naWkgPC0gcmJpbmQoZG9fYW50b2xvZ2lpMSxkb19hbnRvbG9naWkyLGRvX2FudG9sb2dpaTMsZG9fYW50b2xvZ2lpNCkNCiNwb8WCxIVjemVuaWUgcHJ6eWR6aWHFgsOzdyB3IGplZGVuIHBsaWsNCnJlZGFrdG9yenlfemFwaXNvdyA8LSByYmluZChkb19wb2RtaW90b3dlaixkb19wcnplZG1pb3Rvd2VqLGRvX2FudG9sb2dpaSkNCiNwb8WCxIVjemVuaWUgcHJ6eXBpc2FuaWEgemUgemJpb3JlbSANCmJuX29rIDwtIGJuX29rICU+JQ0KICBsZWZ0X2pvaW4oLixyZWRha3Rvcnp5X3phcGlzb3csYnk9ImlkIikgJT4lDQogIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBpZmVsc2UoaXMubmEoRFpfTkFaV0EpLGFzLmNoYXJhY3RlcihyZWRha3Rvcl9kemlhbHUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBCIiwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBHIiwiTUFSVEFLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBMIiwiQkVBVEFLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJMaXRlcmF0dXJhIHdzcMOzxYJjemVzbmEgKHV0d29yeSBhbm9uaW1vd2UgaSB1bG90bmUpIiwiR09TSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJVdHdvcnkgYW5vbmltb3dlIGkgdWxvdG5lIiwiR09TSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iVXR3b3J5IGFub25pbW93ZSBpIHVsb3RuZSAoZXBva2Egbmllem5hbmEpIiwiR09TSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBOIiwiR09TSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gTyIsIkdPU0lBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBRIiwiR09TSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09IkxpdGVyYXR1cmEgYnJ5dHlqc2thIGkgaXJsYW5kemthIiwiRVdBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iVXR3b3J5IGFub25pbW93ZSAoYnJ5dHlqc2thIGkgaXJsYW5kemthKSIsIkVXQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gVSIsIlBBVUxJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBYIiwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBWIiwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gWSIsIlBBVUxJTkEiLGFzLmNoYXJhY3RlcihyZWRha3Rvcl9kemlhbHUpKSkpKSkpKSkpKSkpKSkpKSkNCmJuX29rIDwtIGJuX29rICU+JQ0KICBtdXRhdGUoWkFfVVdBR0kgPSAxOm5yb3coLikpDQoNCiN1amVkbm9saWNlbmllIGxpdGVyYXR1cnkgZGxhIGtpbGt1IHphcGlzw7N3IG5vd2VnbyB0d8OzcmN5DQpraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSA8LSBibl9vayAlPiUNCiAgc2VsZWN0KGlkLFRXX1RXT1JDQV9JRCxUV19OQVpXSVNLTyxUV19JTUlFLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcihpcy5uYShUV19UV09SQ0FfSUQpJiFpcy5uYShUV19OQVpXSVNLTykpICU+JQ0KICBzZWxlY3QoLVRXX1RXT1JDQV9JRCkgJT4lDQogIGFycmFuZ2UoVFdfTkFaV0lTS08sVFdfSU1JRSkgJT4lDQogIGdyb3VwX2J5X2F0KHZhcnMoMjozKSkgJT4lDQogIG11dGF0ZSh1bmlrYXRvd3lfZHppYWwgPSBwYXN0ZSh1bmlxdWUoRFpfRFpJQUxfSUQpLGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gcGFzdGUoRFpfRFpJQUxfSUQsY29sbGFwc2UgPSAifCIpLA0KICAgICAgICAgRFpfTkFaV0EgPSBwYXN0ZShEWl9OQVpXQSxjb2xsYXBzZSA9ICJ8IiksDQogICAgICAgICByZWRha3Rvcl9kemlhbHUgPSBwYXN0ZShyZWRha3Rvcl9kemlhbHUsY29sbGFwc2UgPSAifCIpLA0KICAgICAgICAgaWQgPSBwYXN0ZShpZCxjb2xsYXBzZSA9ICJ8IikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIlxcfCIsdW5pa2F0b3d5X2R6aWFsKSkgJT4lDQogIHNlbGVjdCgtdW5pa2F0b3d5X2R6aWFsKSAlPiUNCiAgbXV0YXRlKGlkX2dydXB5ID0gMTpsZW5ndGhzKC4pKSAlPiUNCiAgY1NwbGl0KC4sYygiaWQiLCJEWl9EWklBTF9JRCIsIkRaX05BWldBIiwicmVkYWt0b3JfZHppYWx1Iiksc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikNCg0Ka2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3lbLDI6N11bZHVwbGljYXRlZChraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSRpZF9ncnVweSksXSA8LSBOQQ0Ka2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kgPC0gZmlsbF8oa2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3ksIG5hbWVzKGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5KSkNCiN6YWt0dWFsaXpvd2FuaWUgemJpb3J1IHBvZG1pb3Rvd3ljaCBvIHVqZWRub2xpY29uZSBkemlhxYJ5IGRsYSBub3d5Y2ggdHfDs3Jjw7N3DQp4IDwtIDE6bGVuZ3RoKGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5JGlkKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBibl9vayREWl9EWklBTF9JRFtibl9vayRpZD09a2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kkaWRbaV1dIDwtIGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5JERaX0RaSUFMX0lEW2ldDQogIGJuX29rJERaX05BWldBW2JuX29rJGlkPT1raWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSRpZFtpXV0gPC0gYXMuY2hhcmFjdGVyKGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5JERaX05BWldBKVtpXQ0KICBibl9vayRyZWRha3Rvcl9kemlhbHVbYm5fb2skaWQ9PWtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5JGlkW2ldXSA8LSBhcy5jaGFyYWN0ZXIoa2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kkcmVkYWt0b3JfZHppYWx1KVtpXQ0KfQ0KI2plxZtsaSBuaWUgbWEgZHppYcWCdSBsdWIgcm9kemFqdSB6YXBpc3UsIHRvIHdwaXNhxIcgaWQgaSBuYXp3xJkgZG8gdXN0YWxlbmlhDQpibl9vayA8LSBibl9vayAlPiUNCiAgbXV0YXRlKERaX0RaSUFMX0lEID1pZmVsc2UoaXMubmEoRFpfRFpJQUxfSUQpLDAsYXMuaW50ZWdlcihEWl9EWklBTF9JRCkpLA0KICAgICAgICAgRFpfTkFaV0EgPSBpZmVsc2UoaXMubmEoRFpfTkFaV0EpLCItLSBkbyB1c3RhbGVuaWEgLS0iLGFzLmNoYXJhY3RlcihEWl9OQVpXQSkpLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID1pZmVsc2UoaXMubmEoUlpfUk9EWkFKX0lEKSwwLGFzLmludGVnZXIoUlpfUk9EWkFKX0lEKSksDQogICAgICAgICBSWl9OQVpXQSA9IGlmZWxzZShpcy5uYShSWl9OQVpXQSksIi0tIGRvIHVzdGFsZW5pYSAtLSIsYXMuY2hhcmFjdGVyKFJaX05BWldBKSkpDQoNCmBgYA0KDQpgYGB7ciBwcm9ibGVteX0NCg0KI3Byenlnb3Rvd2HEhyB3c3p5c3RrbyBkb29rb8WCYSAtIGxpc3R5IHByYWNvd25pa8Ozdzsgd3lzxYJhxIcgeiBSIG9kIHJhenUgbmEgZHlzaz8NCiN6cm9iacSHIHdzcMOzxYJ3eWRhbmllDQoNCnRlc3QgPC0gb3V0ICU+JQ0KICBmaWx0ZXIocHJhY293bmlrID09ICJOQV9wb2RtIikNCg0KDQoNCmBgYA0KDQoNCmBgYHtyIGtzacSFxbxraSBwb2RtaW90b3dlfQ0KZGF0YSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSIpICU+JQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gcGFzdGUocmVkYWt0b3JfZHppYWx1LCJfcG9kbSIsc2VwID0gIiIpKQ0KDQojdXdvbG5pZW5pZSBrb2x1bW4geiBkYW55bWkgeiBibiBpIHByemV0d29yemVuaWUgZG8gUEJMDQojMTogemFfdXdhZ2ksIHJ6X25hendhLCB6YV9yb19yb2ssIHphX3R5cGUsIHJ6X3JvZHphal9pZCwgdHdfdHdvcmNhX2lkLCB0d19uYXp3aXNrbywgdHdfaW1pZSwgZHpfZHppYWxfaWQsIGR6X25hendhLCByZWRha3Rvcl9kemlhbHUNCnBvbGFfcGJsIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgUlpfTkFaV0EsIFpBX1JPX1JPSyA9IHJvaywgUlpfUk9EWkFKX0lELCBUV19UV09SQ0FfSUQsIFRXX05BWldJU0tPLCBUV19JTUlFLCBEWl9EWklBTF9JRCwgRFpfTkFaV0EsIHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShaQV9UWVBFID0gIktTIikNCiMyOiBhdXRvcg0KQk5fYXV0b3IgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFgxMDAsWDI0NSxaQV9VV0FHSSkNCiNwb2xlIDEwMA0KbWFyY19maWVsZF8xMDAgPC0gQk5fYXV0b3IgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMTAwKSU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKEJOX2F1dG9yJFgxMDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8xMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMTAwPC1jYmluZChtYXJjX2ZpZWxkXzEwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzEwMCRYMTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMTAwJFgxMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMTAwJFgxMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzEwMCRYMTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCiNwb2xlIDI0NQ0KbWFyY19maWVsZF8yNDUgPC0gQk5fYXV0b3IgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKEJOX2F1dG9yJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCkJOX2F1dG9yIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShgJGFgID0gaWZlbHNlKCFpcy5uYShgJGJgKSxwYXN0ZShgJGFgLGAkYmAsc2VwID0gIiAiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIig/PD1bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIikpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKEFNX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCBzdHJfcmVwbGFjZV9hbGwoc3RyX3JlbW92ZV9hbGwoYCRhYCwiLCIpLCJcXHwiLCIsICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihgJGFgKSkpLA0KICAgICAgICAgQU1fSU1JRSA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwiKiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFLCBYMjQ1YyA9IGAkY2ApDQogIA0KeCA8LSAxOmxlbmd0aHMoQk5fYXV0b3JbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBCTl9hdXRvciRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoQk5fYXV0b3IkQU1fTkFaV0lTS09baV0sQk5fYXV0b3IkWDI0NWNbaV0pDQogIEJOX2F1dG9yJGN6eV9pbWllW2ldIDwtIGdyZXBsKEJOX2F1dG9yJEFNX0lNSUVbaV0sQk5fYXV0b3IkWDI0NWNbaV0pDQp9DQoNCkJOX2F1dG9yIDwtIEJOX2F1dG9yICU+JQ0KICBtdXRhdGUoWkFfQUROT1RBQ0pFID0gaWZlbHNlKGN6eV9uYXp3aXNrbz09RkFMU0V8Y3p5X2ltaWU9PUZBTFNFLHBhc3RlKCJVV0FHQSEgS29uZmxpa3QgdyBkYW55Y2ggb3NvYm93eWNoIHcgcG9sYWNoIDEwMCBpIDI0NS4gUG9yw7N3bmFqIHBvbGUgYXV0b3IgdyBmb3JtdWxhcnp1IHogcG9sZW0gQk46ICIsWDI0NWMsc2VwID0gIiIpLE5BKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFLFpBX0FETk9UQUNKRSkgJT4lDQogIG11dGF0ZShuYXp3YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIocGFzdGUoQU1fTkFaV0lTS08sQU1fSU1JRSwgc2VwID0gIiIpKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF9hdXRvcnp5ICU+JSBzZWxlY3QoQU1fQVVUT1JfSUQsQU1fS1JZUFRPTklNLEFNX0xJQ1pCQV9aQVBJU09XLG5hendhKSAlPiUgZmlsdGVyKGlzLm5hKEFNX0tSWVBUT05JTSkpLGJ5PSJuYXp3YSIpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUsLUFNX0xJQ1pCQV9aQVBJU09XKQ0KQk5fYXV0b3IkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX2F1dG9yWzE6M10pKQ0KQk5fYXV0b3IgPC0gQk5fYXV0b3JbIWR1cGxpY2F0ZWQoQk5fYXV0b3IkaWRfZ3J1cHkpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFLFpBX0FETk9UQUNKRSxBTV9BVVRPUl9JRCkNCg0KIzM6IHR5dHXFgg0KI3BvbGUgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmAsYCRuYCxgJHBgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJG5gID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkbmApLCIiLGFzLmNoYXJhY3RlcihgJG5gKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRwYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJHBgKSwiIixhcy5jaGFyYWN0ZXIoYCRwYCkpLGNvbGxhcHNlID0gIiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShaQV9UWVRVTCA9IHBhc3RlKGAkYWAsYCRiYCxgJG5gLGAkcGAsc2VwID0gIiIpKQ0KDQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgbXV0YXRlKFpBX1RZVFVMID0gcGFzdGUoYCRhYCxgJGJgLGAkbmAsYCRwYCxzZXAgPSAiICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVtb3ZlKFpBX1RZVFVMLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBaQV9UWVRVTCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiIDsgIiwiLiAiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTCkNCiNkb3Bpc2FuaWUgZ2F0dW5rdSBkbyBwcnplZG1pb3Rvd2VqIG5hIHBvZHN0YXdpZSA2NTUgaSA2NTAgIA0KZ2F0dW5raV9wYmwgPC0gZGF0YS5mcmFtZShnYXR1bmVrID0gYygiYWZvcnl6bSIsICJhbGJ1bSIsICJhbnRvbG9naWEiLCAiYXV0b2Jpb2dyYWZpYSIsICJkemllbm5payIsICJlc2VqIiwgImZlbGlldG9uIiwgImlubmUiLCAia2F6YW5pZSIsICJsaXN0IiwgIm1pbmlhdHVyYSBwcm96xIUiLCAib3Bvd2lhZGFuaWUiLCAicG9lbWF0IiwgInBvd2llxZvEhyIsICJwcm96YSIsICJwcm96YSBwb2V0eWNrYSIsICJyZXBvcnRhxbwiLCAicm96bXnFm2xhbmllIHJlbGlnaWpuZSIsICJyeXN1bmVrLCBvYnJheiIsICJzY2VuYXJpdXN6IiwgInN6a2ljIiwgInRla3N0IGJpYmxpam55IiwgInRla3N0IGRyYW1hdHljem55IiwgImRyYW1hdCIsICJ3aWVyc3oiLCAid3Nwb21uaWVuaWEiLCAid3lwb3dpZWTFuiIsICJwYW1pxJl0bmlraSIsICJwb2V6amEiLCAibGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIiwgInNhdHlyYSIsICJwaW9zZW5rYSIpKQ0KDQojZHJhbWF0LCBwYW1pxJl0bmlraSwgcG9lemphLCBsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEsIHNhdHlyYSwgcGlvc2Vua2ENCmdhdHVua2lfYm4gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTUsWDY1MCkNCg0KZ2F0dW5raV9ibiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgZnJvbSBnYXR1bmtpX2JuDQogICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBnYXR1bmtpX3BibCBvbiBsb3dlcihnYXR1bmtpX2JuLlg2NTUpIGxpa2UgJyUnfHxnYXR1bmtpX3BibC5nYXR1bmVrfHwnJSciKQ0KZ2F0dW5raV9ibiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICBmcm9tIGdhdHVua2lfYm4NCiAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gZ2F0dW5raV9wYmwgb24gbG93ZXIoZ2F0dW5raV9ibi5YNjUwKSBsaWtlICclJ3x8Z2F0dW5raV9wYmwuZ2F0dW5la3x8JyUnIikNCmNvbG5hbWVzKGdhdHVua2lfYm4pWzVdIDwtICJnYXR1bmVrMiINCmdhdHVua2lfYm4gPC0gZ2F0dW5raV9ibiAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBpZmVsc2UoaXMubmEoZ2F0dW5laykmIWlzLm5hKGdhdHVuZWsyKSxhcy5jaGFyYWN0ZXIoZ2F0dW5lazIpLGFzLmNoYXJhY3RlcihnYXR1bmVrKSksDQogICAgICAgICBnYXR1bmVrID0gaWZlbHNlKGdyZXBsKCJwcnp5cG93aWXFm8SHIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSkmIWdyZXBsKCJbXnldcG93aWXFm8SHIixYNjU1KSZnYXR1bmVrPT0icG93aWXFm8SHIiwib3Bvd2lhZGFuaWUiLGFzLmNoYXJhY3RlcihnYXR1bmVrKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGdhdHVuZWspKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGdhdHVuZWspICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGlmZWxzZShnYXR1bmVrPT0iZHJhbWF0IiwidGVrc3QgZHJhbWF0eWN6bnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBhbWnEmXRuaWtpIiwid3Nwb21uaWVuaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwb2V6amEiLCJ3aWVyc3oiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0ibGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIiwicmVwb3J0YcW8IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwaW9zZW5rYSIsIndpZXJzeiIsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkpKSkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShnYXR1bmVrID0gcGFzdGUoZ2F0dW5layxjb2xsYXBzZSA9ICIsICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBnc3ViKCIoXi4pIiwiXFxVXFwxIixwZXJsID0gVFJVRSwgZ2F0dW5laykpDQojcG/FgsSFY3plbmllIHR5dHXFgnUgeiBnYXR1bmtpZW0NCnphX3R5dHVsIDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBsZWZ0X2pvaW4oLixnYXR1bmtpX2JuLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWkFfVFlUVUwgPSBpZmVsc2UoIWlzLm5hKGdhdHVuZWspJihzdWJzdHIoWkFfVFlUVUwsbmNoYXIoWkFfVFlUVUwpLG5jaGFyKFpBX1RZVFVMKSk9PSIuInxzdWJzdHIoWkFfVFlUVUwsbmNoYXIoWkFfVFlUVUwpLG5jaGFyKFpBX1RZVFVMKSk9PSIhInxzdWJzdHIoWkFfVFlUVUwsbmNoYXIoWkFfVFlUVUwpLG5jaGFyKFpBX1RZVFVMKSk9PSI/IikscGFzdGUoWkFfVFlUVUwsIiBbIixnYXR1bmVrLCJdIixzZXAgPSAiIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGdhdHVuZWspJihzdWJzdHIoWkFfVFlUVUwsbmNoYXIoWkFfVFlUVUwpLG5jaGFyKFpBX1RZVFVMKSkhPSIuInxzdWJzdHIoWkFfVFlUVUwsbmNoYXIoWkFfVFlUVUwpLG5jaGFyKFpBX1RZVFVMKSkhPSIhInxzdWJzdHIoWkFfVFlUVUwsbmNoYXIoWkFfVFlUVUwpLG5jaGFyKFpBX1RZVFVMKSkhPSI/IikscGFzdGUoWkFfVFlUVUwsIi4gWyIsZ2F0dW5laywiXSIsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTCkNCiM0OiB0eXR1xYIgb3J5Z2luYcWCdQ0KI3BvbGUgMjQ2DQptYXJjX2ZpZWxkXzI0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NiklPiUNCiAgZmlsdGVyKFgyNDYhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwifiIpLA0KICAgICAgICAgWDI0Nj1zdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ2IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDYhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NiwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NilbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDY8LWNiaW5kKG1hcmNfZmllbGRfMjQ2LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ2JFgyNDYgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDYkWDI0NixzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDZbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDYkWDI0Niksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ2JFgyNDYpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF8yNDYgPC0gbWFyY19maWVsZF8yNDYgJT4lDQogIGZpbHRlcihncmVwbCgib3J5ZyIsWDI0NikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgLGAkbmAsYCRwYCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSxjb2xsYXBzZSA9ICIsICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiIpLA0KICAgICAgICAgYCRuYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJG5gKSwiIixhcy5jaGFyYWN0ZXIoYCRuYCkpLGNvbGxhcHNlID0gIiIpLA0KICAgICAgICAgYCRwYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJHBgKSwiIixhcy5jaGFyYWN0ZXIoYCRwYCkpLGNvbGxhcHNlID0gIiIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKFgyNDYgPSBwYXN0ZShgJGFgLGAkYmAsYCRuYCxgJHBgLHNlcCA9ICIiKSkgJT4lDQogIG11dGF0ZShYMjQ2ID0gc3RyX3JlbW92ZShYMjQ2LCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCJcXC57M30gXFwuezN9IiwiLi4uICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBYMjQ2KQ0KDQojcG9sZSA1MDANCm1hcmNfZmllbGRfNTAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKSU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJ+IiksDQogICAgICAgICBYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIGZpbHRlcihncmVwbCgib3J5Z1xcLlxcOiIsWDUwMCkpICU+JQ0KICBtdXRhdGUoWDUwMCA9IHN0cl9yZW1vdmUoYCRhYCwiXlR5dFxcLiBvcnlnXFwuOiB8XlR5dFxcLCBvcnlnXFwuOiB8Xi4qP3R5dFxcLiBvcnlnXFwuOiAiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSkpKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSkpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwgIlxcLiQiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsIigsezAsMX0gezAsMX0pXFxkezR9LiokfCgsIHR8LiBUKXl0LiBvcnlnLiBjeWtsdToiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKQ0KI3R5dHXFgiBvcnlnaW5hxYJ1DQp6YV90eXR1bF9vcnlnaW5hbHUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDYsYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWDUwMCA9IGlmZWxzZShpcy5uYShYNTAwKSxOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJvcnlnIixYNTAwKSxOQSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJcXC4gLSAiLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiAtIC4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIk5hIGtzacSFxbxjZSBwc2V1ZCIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIE5hIGtzacSFxbxjZSBwc2V1ZC4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIlByemVrxYJcXC4gd2ciLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiBQcnpla8WCXFwuIHdnLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBaQV9UWVRVTF9PUllHSU5BTFUgPSBpZmVsc2UoaXMubmEoWDI0NikmaXMubmEoWDUwMCksTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCksYXMuY2hhcmFjdGVyKFgyNDYpKSksDQogICAgICAgICBaQV9UWVRVTF9PUllHSU5BTFUgPSBzdHJfcmVtb3ZlX2FsbChaQV9UWVRVTF9PUllHSU5BTFUsJ1xcIicpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMX09SWUdJTkFMVSkNCiM1OiBqxJl6eWsgb3J5Z2luYcWCdQ0KbWFyY19maWVsZF8wNDEgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgwNDEpJT4lDQogIGZpbHRlcihYMDQxIT0iIikgJT4lDQogIG11dGF0ZShYMDQxPXN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgwNDEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVtb3ZlX2FsbChYMDQxLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgwNDEsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMDQxLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDQxKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzA0MTwtY2JpbmQobWFyY19maWVsZF8wNDEsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wNDEkWDA0MSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzA0MSRYMDQxLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzA0MVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzA0MSRYMDQxKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wNDEkWDA0MSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfamV6eWtfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMDQxICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfSkVaWUtfT1JZR0lOQUxVID0gYCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9KRVpZS19PUllHSU5BTFUgPSBzdHJfcmVwbGFjZV9hbGwoWkFfSkVaWUtfT1JZR0lOQUxVLCJcXCRhIiwiLCIpKSAlPiUNCiAgdW5pcXVlKCkNCg0KIzY6IHdzcMOzxYJ0d8OzcmN5DQptYXJjX2ZpZWxkXzcwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIiguLlxcJGEpIiwifFxcMSIpLA0KICAgICAgICAgWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvc29iYSA9IGAkYWAsZnVua2NqYSA9IGAkZWApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGZ1bmtjamEpKSAlPiUNCiAgbXV0YXRlKG9zb2JhID0gc3RyX3JlbW92ZShvc29iYSwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSwNCiAgICAgICAgIE9TX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKG9zb2JhKSksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSwNCiAgICAgICAgIHdzX3Byb3N0eSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIob3NvYmEpLCAiXFxXIiwgIiIpLA0KICAgICAgICAgZnVfcHJvc3RhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihmdW5rY2phKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF93c3BvbHR3b3JjeSAlPiUgc2VsZWN0KE9TX09TT0JBX0lELE9TX0xJQ1pCQV9aQVBJU09XLG5hendhX3Byb3N0YSksYnk9Yygid3NfcHJvc3R5Ij0ibmF6d2FfcHJvc3RhIikpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsLU9TX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhWzE6Ml0pKQ0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2FbIWR1cGxpY2F0ZWQoQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkpLF0gJT4lDQogIGxlZnRfam9pbiguLFBCTF9mdW5rY2plLGJ5PWMoImZ1X3Byb3N0YSI9Im5hendhIikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLE5BLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojdHV0YWogcHJ6ZXN6dWthxIcgWDI0NSBpIHpuYWxlxbrEhyBixYLEmWR5IHdzcMOzxYJ0d8OzcmPDs3cNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoQk5fd3Nwb2x0d29yY2FbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBCTl93c3BvbHR3b3JjYSRjenlfbmF6d2lza29baV0gPC0gc3RyX2RldGVjdChCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSxCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggNzAwIGkgMjQ1LiBQb3LDs3duYWogcG9sYSB3c3DDs8WCdMOzcmPDs3cgdyBmb3JtdWxhcnp1IHogcG9sZW0gQk46ICIsWDI0NWMsc2VwID0gIiIpLE5BKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phLFpBX0FETk9UQUNKRSkNCg0KIzc6IG9waXMgd3Nww7PFgnR3w7NyY8Ozdw0Kb3Bpc193c3BvbHR3b3Jjb3cgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxmdW5rY2phLE9TX0lNSUUsT1NfTkFaV0lTS08pICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShPU19OQVpXSVNLTyl8KGlzLm5hKE9TX05BWldJU0tPKSZncmVwbCgiZXQgYWxcXC4iLFgyNDVjKSkpICU+JQ0KICBtdXRhdGUoamVzdF9ldF9hbCA9IGdyZXBsKCJldCBhbFxcLiIsWDI0NWMpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShPU19JTUlFPT0iKiIsIiIsYXMuY2hhcmFjdGVyKE9TX0lNSUUpKSwNCiAgICAgICAgIG9waXMgPSBpZmVsc2UoIWlzLm5hKE9TX05BWldJU0tPKSxwYXN0ZShmdW5rY2phLE9TX0lNSUUsIE9TX05BWldJU0tPLCBzZXAgPSAiICIpLCIiKSwNCiAgICAgICAgIG9waXMgPSBzdHJfcmVwbGFjZV9hbGwob3BpcywiICsiLCIgIiksDQogICAgICAgICBvcGlzID0gaWZlbHNlKG9waXM9PSIgIiwiIixhcy5jaGFyYWN0ZXIob3BpcykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsamVzdF9ldF9hbCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBwYXN0ZShvcGlzLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBqZXN0X2V0X2FsID0gcGFzdGUodW5pcXVlKGplc3RfZXRfYWwpLHNlcCA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShvcGlzID0gaWZlbHNlKGplc3RfZXRfYWw9PVRSVUUmb3Bpcz09IiIsImV0IGFsLiIsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShqZXN0X2V0X2FsLHBhc3RlKG9waXMsImV0IGFsLiIsc2VwID0gIiAiKSxvcGlzKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcykNCg0KIzcwMA0KbWFyY19maWVsZF83MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoLi5cXCRhKSIsInxcXDEiKSwNCiAgICAgICAgIFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgZnVua2NqYV9kdXphID0gc3RyX3RvX2xvd2VyKGZ1bmtjamEpLA0KICAgICAgICAgb3BpcyA9IHBhc3RlKGZ1bmtjamFfZHV6YSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpLA0KICAgICAgICAgb3Bpc19kdXp5ID0gcGFzdGUoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsb3Bpc19kdXp5KSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUob3BpcyA9IHBhc3RlKG9waXMsY29sbGFwc2UgPSAiLiAiKSwNCiAgICAgICAgIG9waXNfZHV6eSA9IHBhc3RlKG9waXNfZHV6eSxjb2xsYXBzZSA9ICIuICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQojb3BpcyB3c3DDs8WCdHfDs3Jjw7N3IHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRjYCkNCg0KI3BvcsOzd25hbmllIG9waXN1IHdzcMOzxYJ0d8OzcmPDs3cgeiAyNDUgaSA3MDANCndzcG9sdHdvcmN5IDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgY1NwbGl0KC4sIiRjIixzZXAgPSAiIDsgIixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICAjb2dyYW5pY3phbmllIG9zw7NiIHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kNCiAgbXV0YXRlKGN6eV9tYWxhID0gZ3JlcGwoIiBbYS16xJnDs8SFxZvFgsW8xbrEh8WEXXxeW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XFxbW2EtesSZw7PEhcWbxYLFvMW6xIfFhF0iLGAkY2AsaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQ0KICBmaWx0ZXIoY3p5X21hbGE9PVRSVUUpICU+JQ0KICBzZWxlY3QoLWN6eV9tYWxhKSAlPiUNCiAgI211dGF0ZShgJGNgID0gZ3N1YigiXihcXFspezAsMX0oW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIsIlxcMVxcVVxcMiIscGVybCA9IFRSVUUsYCRjYCkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShYMjQ1ID0gcGFzdGUoYCRjYCwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogIHNlbGVjdCgtYCRjYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUob3JkZXJfcGJsID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChvcGlzLCIoPzw9XnwgfFxcW3wtKShbQS1aQcOBw4DDgsODw4TEgsSAw4XEhMOGRcOJw4jDisOLxJrEksSWxJhJw43DjMOOw4/EqsSuSU/Dk8OSw5TDlcOWxZDDmMWSVcOaw5nDm8OcxbDFqsWvWcOdQ8SGxIzDp0TEjsSQxJBHxKLEnkvEtkzFgcS7TsWDw5HFh8WFxYpSxZhTxZrFoMWeU8OfVMWkxabDnsWiOFrFu8W5xb1hLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiKSksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfcGJsLCIoLio/XCIpKC4pKFwiLio/LikiLCAiXFwyIiksDQogICAgICAgICBvcmRlcl9ibiA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoWDI0NSwiKD88PV58IHxcXFt8LSkoW0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9YS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIikpLA0KICAgICAgICAgb3JkZXJfYm4gPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfYm4sIiguKj9cIikoLikoXCIuKj8uKSIsICJcXDIiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxdIiksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVtb3ZlX2FsbChvcmRlcl9wYmwsICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIG9yZGVyX2JuID0gc3RyX3JlbW92ZV9hbGwob3JkZXJfYm4sICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIHRvX3NhbW8gPSBvcmRlcl9wYmw9PW9yZGVyX2JuLA0KICAgICAgICAgWDI0NSA9IGdzdWIoIiheW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSguKikiLCJcXFVcXDFcXEVcXDIiLHBlcmwgPSBUUlVFLCBYMjQ1KSkgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKGN6eV9wbCA9IGdyZXBsKCJwb2wiLFpBX0pFWllLX09SWUdJTkFMVSl8aXMubmEoWkFfSkVaWUtfT1JZR0lOQUxVKSwNCiAgICAgICAgIGRlY3l6amEgPSBpZmVsc2UodG9fc2Ftbz09RkFMU0V8Y3p5X3BsPT1GQUxTRSxGQUxTRSxUUlVFKSkNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gd3Nwb2x0d29yY3kgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IGlmZWxzZShkZWN5emphPT1UUlVFLGFzLmNoYXJhY3RlcihYMjQ1KSxwYXN0ZShYMjQ1LG9waXNfZHV6eSxzZXAgPSAiIyIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzX2R1enksemFfb3Bpc193c3BvbHR3b3Jjb3cpICU+JQ0KICBjU3BsaXQoLiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLHNlcCA9ICIjIixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3dfMiA9IGlmZWxzZShpcy5uYSh6YV9vcGlzX3dzcG9sdHdvcmNvd18yKSwnJyxhcy5jaGFyYWN0ZXIoemFfb3Bpc193c3BvbHR3b3Jjb3dfMikpLA0KICAgICAgICAgdG9fc2FtbyA9IHphX29waXNfd3Nwb2x0d29yY293XzE9PXphX29waXNfd3Nwb2x0d29yY293XzIpICU+JQ0KICBmaWx0ZXIodG9fc2Ftbz09RkFMU0UpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHBhc3RlKHphX29waXNfd3Nwb2x0d29yY293XzEsemFfb3Bpc193c3BvbHR3b3Jjb3dfMixzZXAgPSAiIyIpLA0KICAgICAgICAgemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBzdHJfcmVtb3ZlX2FsbCh6YV9vcGlzX3dzcG9sdHdvcmNvdywiXFwjJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfd3Nwb2x0d29yY293KQ0KDQpvcGlzX3dzcG9sdHdvcmNvdyA8LSBvcGlzX3dzcG9sdHdvcmNvdyAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgemFfb3Bpc193c3BvbHR3b3Jjb3ckWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9waXMpKSAlPiUNCiAgcmVuYW1lKHphX29waXNfd3Nwb2x0d29yY293ID0gb3BpcykNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gemFfb3Bpc193c3BvbHR3b3Jjb3cgJT4lDQogIGJpbmRfcm93cyguLG9waXNfd3Nwb2x0d29yY293KSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzggd3lkYW5pZQ0KbWFyY19maWVsZF8yNTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNTApJT4lDQogIGZpbHRlcihYMjUwIT0iIikgJT4lDQogIG11dGF0ZShYMjUwPXN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVtb3ZlX2FsbChYMjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI1MDwtY2JpbmQobWFyY19maWVsZF8yNTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNTAkWDI1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI1MCRYMjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI1MCRYMjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNTAkWDI1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV93eWRhbmllIDwtIG1hcmNfZmllbGRfMjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIHd5ZGFuaWUgPSBgJGFgKSAlPiUNCiAgbXV0YXRlKHd5ZGFuaWUgPSBzdHJfcmVtb3ZlKHd5ZGFuaWUsIiBcXC8kIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojOTogaW5zdHl0dWNqYSBzcHJhd2N6YQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYMjQ1YykpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7IixYMjQ1Yyksc3RyX3JlcGxhY2VfYWxsKFgyNDVjLCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3Rocyh6YV9pbnN0eXR1Y2phWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgemFfaW5zdHl0dWNqYSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19OQVpXSVNLT1tpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KICB6YV9pbnN0eXR1Y2phJGN6eV9pbWllW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfSU1JRVtpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamEgJT4lDQogIGZpbHRlcihpcy5uYShjenlfbmF6d2lza28pJmlzLm5hKGN6eV9pbWllKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighZ3JlcGwoIl5cXFtbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl18XlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIsaW5zdHl0dWNqYSkpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IHN0cl9yZW1vdmUoaW5zdHl0dWNqYSwiXFwuJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGluc3R5dHVjamEpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTA6IHd5ZGF3bmljdHdvDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNjApICU+JQ0KICBtdXRhdGUoWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwublxcLiIsICJiLncuIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJTXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZW1vdmUoWDI2MCwiXlxcXFwrIiksIA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwgDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCAiLlxcJGMuKiIsICIiKSwgDQogICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgIGlsZV9taWVqc2MgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRhIiksDQogICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChiZXpfcm9rdSwgIlxcJC4iKSksICJbXmEtel0iLCAiIiksDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpLA0KICAgICAgICAgd3lkYXdfcG9kemllbCA9IGlmZWxzZShpbGVfd3lkYXduaWN0dz5pbGVfbWllanNjfGtvbGVqbm9zYz09ImNhYWJiIiwgc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiKFxcJGEpKC4qPykoIDpcXCRiLio/KSggOlxcJGIpIiwgIlxcMVxcMlxcMyA7JGFcXDJcXDQiKSxiZXpfcm9rdSksDQogICAgICAgICB3eWRhd25pY3R3b190ZXN0ID0gc3RyX3JlcGxhY2VfYWxsKHd5ZGF3X3BvZHppZWwsICIoXFwkYikoLio/KSggO1xcJGEpIiwgIlxcMVxcMnxcXDMiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxyb2tfd3lkYW5pYSx3eWRhd25pY3R3b190ZXN0KSAlPiUNCiAgY1NwbGl0KC4sICJ3eWRhd25pY3R3b190ZXN0Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBtdXRhdGUod3lkYXduaWN0d28gPSBzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdCh3eWRhd25pY3R3b190ZXN0KSwgIlxcJFxcdyIsICIiKSwgIlxcVyIsICIiKSkpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3lkYXduaWN0d2EsYnk9Im5hendhX3Byb3N0YSIpICU+JQ0KICBtdXRhdGUodG9fc2FtbyA9IHd5ZGF3bmljdHdvPT1XWV9OQVpXQSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLXRvX3NhbW8sLVdZX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvWzE6M10pKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShXWV9OQVpXQSA9IGlmZWxzZSghaXMubmEoV1lfTkFaV0EpLGFzLmNoYXJhY3RlcihXWV9OQVpXQSksYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdvKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2UoIWlzLm5hKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKG1pZWpzY2Vfd3lkYW5pYSkpLA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwocm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIiksDQogICAgICAgICB6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZShuY2hhcihyb2tfd3lkYW5pYSk9PTQsYXMuY2hhcmFjdGVyKHJva193eWRhbmlhKSxOQSksDQogICAgICAgICBkb19vcGlzdSA9IGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSkscGFzdGUoIlsiLHN0cl9leHRyYWN0KHJva193eWRhbmlhLCJcXGR7NH0iKSwiXSIsc2VwID0gIiIpLCIiKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZShzdWJzdHIoV1lfTUlBU1RPLDEsMSk9PSJbIiZzdWJzdHIoV1lfTUlBU1RPLG5jaGFyKFdZX01JQVNUTyksbmNoYXIoV1lfTUlBU1RPKSkhPSJdIiZpcy5uYShXWV9XWURBV05JQ1RXT19JRCkscGFzdGUodHJpbShXWV9NSUFTVE8pLCJdIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKFdZX01JQVNUTykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSxkb19vcGlzdSkNCg0KIzExOiBvcGlzIGZpenljem55IGtzacSFxbxraQ0KI3BvbGUgMzAwIGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfMzAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMzAwKSU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVwbGFjZV9hbGwoWDMwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgzMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgzMDA9c3RyX3JlbW92ZV9hbGwoWDMwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDMwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzMwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8zMDA8LWNiaW5kKG1hcmNfZmllbGRfMzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMzAwJFgzMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8zMDAkWDMwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8zMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8zMDAkWDMwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMzAwJFgzMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMzAwIDwtIG1hcmNfZmllbGRfMzAwICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRiYCA9IHN0cl9yZW1vdmUoYCRiYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRlYCA9IGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApJmdyZXBsKCJcXCsgZHlza3xwxYJ5dCIsYCRlYCksc3RyX2V4dHJhY3QoYCRlYCwiKD88PVxcKykoZHlza3xwxYJ5dC4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkNELVJPTXxEVkR8VkNEfENEIixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoXi4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLE5BKSksDQogICAgICAgICBgJGFgID0gaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksDQogICAgICAgICBgJGJgID0gaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGlzLm5hKGAkZWApLCIiLGFzLmNoYXJhY3RlcihgJGVgKSkpDQojcG9sZSA1MDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF81MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIGZpbHRlcighZ3JlcGwoIm9yeWcoXFwufFxcLCkiLFg1MDApJmdyZXBsKCJwc2V1ZHxuYXp3YXxkb3R5Y3p8cG9sIixYNTAwLGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpKQ0KICANCiNwb2xlIDU0NiBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzU0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDU0NiklPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlcGxhY2VfYWxsKFg1NDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDU0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZW1vdmVfYWxsKFg1NDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1NDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81NDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTQ2PC1jYmluZChtYXJjX2ZpZWxkXzU0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzU0NiRYNTQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTQ2JFg1NDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTQ2JFg1NDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzU0NiRYNTQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCg0KemFfb3Bpc19rcyA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byAlPiUgc2VsZWN0KFpBX1VXQUdJLGRvX29waXN1KSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8zMDAgJT4lIHNlbGVjdChaQV9VV0FHSSxYMzAwYT1gJGFgLFgzMDBiPWAkYmAsWDMwMGU9YCRlYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDUwMGE9YCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTQ2ICU+JSBzZWxlY3QoWkFfVVdBR0ksWDU0NmE9YCRhYCksYnk9IlpBX1VXQUdJIikNCnphX29waXNfa3NbaXMubmEoemFfb3Bpc19rcyldICA8LSAiIg0KemFfb3Bpc19rcyA8LSB6YV9vcGlzX2tzICU+JQ0KICBtdXRhdGUoemFfb3Bpc19rcyA9IHBhc3RlKGlmZWxzZShkb19vcGlzdSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKGRvX29waXN1KSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGIhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYiksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwZSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBlKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFg1MDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDUwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDU0NmEhPSIiLGFzLmNoYXJhY3RlcihYNTQ2YSksIiIpLHNlcCA9ICIiKSwNCiAgICAgICAgIHphX29waXNfa3MgPSBzdHJfcmVtb3ZlKHphX29waXNfa3MsIigsICkrJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfa3MpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoemFfb3Bpc19rcykpDQp6YV9vcGlzX2tzJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZCh6YV9vcGlzX2tzWzFdKSkNCnphX29waXNfa3MgPC0gemFfb3Bpc19rc1shZHVwbGljYXRlZCh6YV9vcGlzX2tzJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KQ0KDQojMTI6IHNlcmlhIHd5ZGF3bmljemENCm1hcmNfZmllbGRfNDkwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNDkwLFg4MDAsWDgzMCkgJT4lDQogIG11dGF0ZShYNDkwID0gaWZlbHNlKGdyZXBsKCJVXFwrIixYNDkwKSxhcy5jaGFyYWN0ZXIoWDgzMCksYXMuY2hhcmFjdGVyKFg0OTApKSkgJT4lDQogIG11dGF0ZShYODAwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODAwKSksDQogICAgICAgICBYODMwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODMwKSksDQogICAgICAgICBYODAwID0gc3RyX3JlcGxhY2UoWDgwMCwiKFxcJGEpKC4qKShcXCR0KSIsIlxcMSIpLA0KICAgICAgICAgWDQ5MCA9IGlmZWxzZShYNDkwPT0iIiZYODMwIT0iIixhcy5jaGFyYWN0ZXIoWDgzMCksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShYNDkwPT0iIiZYODAwIT0iIixhcy5jaGFyYWN0ZXIoWDgwMCksYXMuY2hhcmFjdGVyKFg0OTApKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCkgJT4lDQogIGZpbHRlcihYNDkwIT0iIikgJT4lDQogIG11dGF0ZShYNDkwPXN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg0OTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVtb3ZlX2FsbChYNDkwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg0OTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNDkwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNDkwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzQ5MDwtY2JpbmQobWFyY19maWVsZF80OTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF80OTAkWDQ5MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzQ5MCRYNDkwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzQ5MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzQ5MCRYNDkwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF80OTAkWDQ5MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfc2VyaWFfd3lkYXduaWN6YSA8LSBtYXJjX2ZpZWxkXzQ5MCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKD0pKFxcJGEpIiwiXFwxICIpLA0KICAgICAgICAgYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCR2YCA9IGlmZWxzZShpcy5uYShgJHZgKSwiIixhcy5jaGFyYWN0ZXIoYCR2YCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShgJGFgKSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZW1vdmUocGFzdGUoIigiLGAkYWAsIjsgIixgJHZgLCIpIixzZXAgPSAiIiksIjsgKD89XFwpJCkiKSwNCiAgICAgICAgIHNlcmlhID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLHNlcmlhKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxzZXJpYSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gcGFzdGUoc2VyaWEsY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gc3RyX3JlcGxhY2VfYWxsKHNlcmlhLCJcXCQuIiwiOyAiKSkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiMxMzogdG9teQ0KemFfdG9teSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoemFfdG9teSA9IE5BKQ0KDQojMTQ6IGFkbm90YWNqZQ0KemFfYWRub3RhY2plIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EgJT4lIHNlbGVjdChaQV9VV0FHSSxaQV9BRE5PVEFDSkUpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWkFfQUROT1RBQ0pFID0gcGFzdGUoaWZlbHNlKGlzLm5hKFpBX0FETk9UQUNKRS54KSwiIixwYXN0ZShhcy5jaGFyYWN0ZXIoWkFfQUROT1RBQ0pFLngpLCIjICIsc2VwID0gIiIpKSxpZmVsc2UoaXMubmEoWkFfQUROT1RBQ0pFLnkpLCIiLGFzLmNoYXJhY3RlcihaQV9BRE5PVEFDSkUueSkpLHNlcCA9ICIiKSwNCiAgICAgICAgIFpBX0FETk9UQUNKRSA9IHN0cl9yZW1vdmUoWkFfQUROT1RBQ0pFLCIoIyApKyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9BRE5PVEFDSkUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoWkFfQUROT1RBQ0pFKSkNCnphX2Fkbm90YWNqZSRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoemFfYWRub3RhY2plWzFdKSkNCnphX2Fkbm90YWNqZSA8LSB6YV9hZG5vdGFjamVbIWR1cGxpY2F0ZWQoemFfYWRub3RhY2plJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KQ0KDQojMTU6IEJOX1VSTA0KQk5fVVJMIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxCTl9VUkwpDQoNCiN3eXLDs3duYW5pZSBsaWN6Ynkgd2llcnN6eSBkbyBsaWN6Ynkgd2llcnN6eSBvYmlla3R1IGRhdGENCkJOX2F1dG9yIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yICU+JSBzZWxlY3QoWkFfVVdBR0ksQU1fQVVUT1JfSUQsQU1fTkFaV0lTS08sQU1fSU1JRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIEFNX0FVVE9SX0lEID0gcGFzdGUoQU1fQVVUT1JfSUQsIGNvbGxhcHNlPSJ8IiksIEFNX05BWldJU0tPID0gcGFzdGUoQU1fTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIEFNX0lNSUUgPSBwYXN0ZShBTV9JTUlFLCBjb2xsYXBzZT0ifCIpKQ0KQk5fd3Nwb2x0d29yY2EgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EgJT4lIHNlbGVjdChaQV9VV0FHSSxPU19PU09CQV9JRCxPU19OQVpXSVNLTyxPU19JTUlFLGZvX3N5bWJvbCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIE9TX09TT0JBX0lEID0gcGFzdGUoT1NfT1NPQkFfSUQsIGNvbGxhcHNlPSJ8IiksIE9TX05BWldJU0tPID0gcGFzdGUoT1NfTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIE9TX0lNSUUgPSBwYXN0ZShPU19JTUlFLCBjb2xsYXBzZT0ifCIpLCBmb19zeW1ib2wgPSBwYXN0ZShmb19zeW1ib2wsIGNvbGxhcHNlPSJ8IikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLCJOQSIsYXMuY2hhcmFjdGVyKGZvX3N5bWJvbCkpKQ0KQk5fd3lkYXduaWN0d28gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxXWV9XWURBV05JQ1RXT19JRCxXWV9OQVpXQSxXWV9NSUFTVE8semFfcm9rX3d5ZGFuaWEpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBXWV9XWURBV05JQ1RXT19JRCA9IHBhc3RlKFdZX1dZREFXTklDVFdPX0lELCBjb2xsYXBzZT0ifCIpLCBXWV9OQVpXQSA9IHBhc3RlKFdZX05BWldBLCBjb2xsYXBzZT0ifCIpLCBXWV9NSUFTVE8gPSBwYXN0ZShXWV9NSUFTVE8sIGNvbGxhcHNlPSJ8IiksIHphX3Jva193eWRhbmlhID0gcGFzdGUodW5pcXVlKHphX3Jva193eWRhbmlhKSwgY29sbGFwc2U9InwiKSkgJT4lDQogIG11dGF0ZSh6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZSh6YV9yb2tfd3lkYW5pYT09Ik5BIiwiIixhcy5pbnRlZ2VyKHphX3Jva193eWRhbmlhKSkpDQoNCiNwb8WCxIVjemVuaWUgd3N6eXN0a2ljaCBlbGVtZW50w7N3IHcgamVkbsSFIHRhYmVsxJkNCmtvbGVqbm9zYyA8LSBjKCJaQV9VV0FHSSIsIlJaX05BWldBIiwiWkFfUk9fUk9LIiwiWkFfVFlQRSIsIlJaX1JPRFpBSl9JRCIsIkRaX05BWldBIiwiRFpfRFpJQUxfSUQiLCJUV19UV09SQ0FfSUQiLCJBTV9BVVRPUl9JRCIsIkFNX05BWldJU0tPIiwiQU1fSU1JRSIsIlpBX1RZVFVMIiwiWkFfVFlUVUxfT1JZR0lOQUxVIiwiWkFfSkVaWUtfT1JZR0lOQUxVIiwiT1NfT1NPQkFfSUQiLCJPU19OQVpXSVNLTyIsIk9TX0lNSUUiLCJmb19zeW1ib2wiLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsInd5ZGFuaWUiLCJ6YV90b215IiwiaW5zdHl0dWNqYSIsIldZX1dZREFXTklDVFdPX0lEIiwiV1lfTUlBU1RPIiwiV1lfTkFaV0EiLCJ6YV9yb2tfd3lkYW5pYSIsInphX29waXNfa3MiLCJzZXJpYSIsIlRXX05BWldJU0tPIiwiVFdfSU1JRSIsInJlZGFrdG9yX2R6aWFsdSIsIlpBX0FETk9UQUNKRSIsIkJOX1VSTCIpDQpwb2xhY3pvbmUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4scG9sYV9wYmwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fYXV0b3IsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdHl0dWwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdHl0dWxfb3J5Z2luYWx1LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9vcGlzX3dzcG9sdHdvcmNvdyxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV93eWRhbmllLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2luc3R5dHVjamEsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28sYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfb3Bpc19rcyxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9zZXJpYV93eWRhd25pY3phLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3RvbXksYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfYWRub3RhY2plLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX1VSTCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBzZWxlY3Qobm9xdW90ZShrb2xlam5vc2MpKQ0KY29sbmFtZXMocG9sYWN6b25lKSA8LSBjKCJyZWtvcmRfQk4iLCJyel9uYXp3YSIsInphX3JvX3JvayIsInphX3R5cGUiLCJyel9yb2R6YWpfaWQiLCJEWl9OQVpXQSIsIkRaX0RaSUFMX0lEIiwidHdfdHdvcmNhX2lkIiwiYW1fYXV0b3JfaWQiLCJhbV9uYXp3aXNrbyIsImFtX2ltaWUiLCJ6YV90eXR1bCIsInphX3R5dHVsX29yeWdpbmFsdSIsInphX2plenlrX29yeWdpbmFsdSIsIm9zX29zb2JhX2lkIiwib3NfbmF6d2lza28iLCJvc19pbWllIiwiZm9fc3ltYm9sIiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCJ6YV93eWRhbmllIiwiemFfdG9teSIsInphX2luc3R5dHVjamEiLCJ3eV93eWRhd25pY3R3b19pZCIsInd5X21pZWpzY2UiLCJ3eV9uYXp3YSIsInphX3Jva193eWRhbmlhIiwiemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIiwiemFfc2VyaWFfd3lkYXduaWN6YSIsInR3X25hendpc2tvIiwidHdfaW1pZSIsInByYWNvd25payIsInphX2Fkbm90YWNqZSIsIkJOX1VSTCIpDQoNCiN6YXN5Z25hbGl6b3dhbmllIG5pZXBvcHJhd25lZ28ga29kb3dhbmlhDQp4IDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCI8VVxcKyguLi4uKT4iLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkhPTAscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIELFgsSFZCBrb2Rvd2FuaWEgdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgWm5hamTFuiBmcmF6xJkgXCI/Pz9cIiBpIHpyZWRhZ3VqIHBvbGUuIixzZXAgPSAiIiksc2VwID0gIiMgIikscGFzdGUoIlVXQUdBISBCxYLEhWQga29kb3dhbmlhIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIFpuYWpkxbogZnJhesSZIFwiPz8/XCIgaSB6cmVkYWd1aiBwb2xlLiIsc2VwID0gIiIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQogIHBvbGFjem9uZVssaV0gPC0gZ3N1YigiPFVcXCsoLi4uLik+IiwgIj8/PyIsIHBvbGFjem9uZVssaV0pDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIHpuYWt1ICQgdyBrdMOzcnltxZsgeiBww7NsDQpYIDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJcXCQiLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyB6bmFrIFwiJFwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIikscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIHpuYWsgXCIkXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSBmcmF6eSAiY2hhcmFjdGVyKDApIiB3IGt0w7NyeW3FmyB6IHDDs2wNClggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoImNoYXJhY3RlclxcKDBcXCkiLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyBmcmF6xJkgXCJjaGFyYWN0ZXIoMClcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyBmcmF6xJkgXCJjaGFyYWN0ZXIoMClcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIHpuYWt1ICMgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8Ozdw0KcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIlxcIyIscG9sYWN6b25lJHphX29waXNfd3Nwb2x0d29yY293KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEga29uZmxpa3QgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8OzdyB3eWJpZXJ6IHfFgmHFm2Npd8SFIHdhcnRvxZvEhyAoc3RyZWZhIG9kcG93aWVkemlhbG5vxZtjaSBcIiNcIiB3c3DDs8WCdHfDs3JjeSB6IHBvbGEgNzAwKS4iLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUsIlVXQUdBISBaZSB3emdsxJlkdSBuYSBrb25mbGlrdCB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3IHd5Ymllcnogd8WCYcWbY2l3xIUgd2FydG/Fm8SHIChzdHJlZmEgb2Rwb3dpZWR6aWFsbm/Fm2NpICMgd3Nww7PFgnR3w7NyY3kgeiBwb2xhIDcwMCkuIixzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KI2tvcmVrdGEgYXV0b21hdHljem5lZ28gSU9LDQphdXRvbWF0eWN6bnlfSU9LIDwtIHBvbGFjem9uZSAlPiUNCiAgbXV0YXRlKGN6eV90eXRfb3J5ZyA9ICghZ3JlcGwoInBvbHNrIixEWl9OQVpXQSkmIWlzLm5hKHphX3R5dHVsX29yeWdpbmFsdSkpfGdyZXBsKCJwb2xzayIsRFpfTkFaV0EpKSAlPiUNCiAgZmlsdGVyKHphX2Fkbm90YWNqZT09IiImYW1fbmF6d2lza28hPSJOQSImIWdyZXBsKCJwc2V1ZHxuYXp3Iix6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpJiFncmVwbCgiXFx8IixhbV9uYXp3aXNrbykmY3p5X3R5dF9vcnlnPT1UUlVFKSAlPiUNCiAgc2VsZWN0KHJla29yZF9CTikgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBmaWx0ZXIocmVrb3JkX0JOICVub3RpbiUgZGF0YSRaQV9VV0FHSVtkYXRhJGN6eV9hdXRvbWF0eWN6bmllPT0ibmllIl0pICU+JQ0KICBtdXRhdGUoYXV0b21hdHljem55X2ltcG9ydCA9ICJ0YWsiKQ0KDQp3cml0ZS5jc3YyKGF1dG9tYXR5Y3pueV9JT0ssICJDOi9Vc2Vycy9DZXphcnkvRGVza3RvcC9pbXBfMjAwOV9hdXRvbWF0eWN6bmVfcG9kbWlvdG93ZS5jc3YiLCByb3cubmFtZXMgPSBGLCBuYSA9ICcnLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgnKQ0KDQpvdXQgPC0gY1NwbGl0KHBvbGFjem9uZSwgYygiYW1fYXV0b3JfaWQiLCAiYW1fbmF6d2lza28iLCAiYW1faW1pZSIsIm9zX29zb2JhX2lkIiwib3NfbmF6d2lza28iLCAib3NfaW1pZSIsICJmb19zeW1ib2wiLCJ3eV93eWRhd25pY3R3b19pZCIsInd5X21pZWpzY2UiLCJ3eV9uYXp3YSIpLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKQ0KDQpvdXQkcmVrb3JkX0JOIDwtIGlmZWxzZShpcy5uYShvdXQkcmVrb3JkX0JOKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJla29yZF9CTikpDQpvdXQkcnpfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKG91dCRyel9uYXp3YSksJycsYXMuY2hhcmFjdGVyKG91dCRyel9uYXp3YSkpDQpvdXQkemFfcm9fcm9rIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9fcm9rKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3JvX3JvaykpDQpvdXQkemFfdHlwZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5cGUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHlwZSkpDQpvdXQkcnpfcm9kemFqX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfcm9kemFqX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJ6X3JvZHphal9pZCkpDQpvdXQkRFpfTkFaV0EgPC0gaWZlbHNlKGlzLm5hKG91dCREWl9OQVpXQSksJycsYXMuY2hhcmFjdGVyKG91dCREWl9OQVpXQSkpDQpvdXQkRFpfRFpJQUxfSUQgPC0gaWZlbHNlKGlzLm5hKG91dCREWl9EWklBTF9JRCksJycsYXMuY2hhcmFjdGVyKG91dCREWl9EWklBTF9JRCkpDQpvdXQkdHdfdHdvcmNhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfdHdvcmNhX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X3R3b3JjYV9pZCkpDQpvdXQkYW1fYXV0b3JfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9hdXRvcl9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9hdXRvcl9pZCkpDQpvdXQkYW1fbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9uYXp3aXNrbykpDQpvdXQkYW1faW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JGFtX2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1faW1pZSkpDQpvdXQkemFfdHl0dWwgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXR1bCksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bCkpDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1IDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWxfb3J5Z2luYWx1KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5dHVsX29yeWdpbmFsdSkpDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1IDwtIGlmZWxzZShpcy5uYShvdXQkemFfamV6eWtfb3J5Z2luYWx1KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2plenlrX29yeWdpbmFsdSkpDQpvdXQkb3Nfb3NvYmFfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19vc29iYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRvc19vc29iYV9pZCkpDQpvdXQkb3NfbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCRvc19uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCRvc19uYXp3aXNrbykpDQpvdXQkb3NfaW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JG9zX2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfaW1pZSkpDQpvdXQkZm9fc3ltYm9sIDwtIGlmZWxzZShpcy5uYShvdXQkZm9fc3ltYm9sKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGZvX3N5bWJvbCkpDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdyksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdykpDQpvdXQkemFfd3lkYW5pZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3d5ZGFuaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfd3lkYW5pZSkpDQpvdXQkemFfdG9teSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3RvbXkpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdG9teSkpDQpvdXQkemFfaW5zdHl0dWNqYSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2luc3R5dHVjamEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfaW5zdHl0dWNqYSkpDQpvdXQkd3lfd3lkYXduaWN0d29faWQgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV93eWRhd25pY3R3b19pZCksJycsYXMuY2hhcmFjdGVyKG91dCR3eV93eWRhd25pY3R3b19pZCkpDQpvdXQkd3lfbWllanNjZSA8LSBpZmVsc2UoaXMubmEob3V0JHd5X21pZWpzY2UpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbWllanNjZSkpDQpvdXQkd3lfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9uYXp3YSksJycsYXMuY2hhcmFjdGVyKG91dCR3eV9uYXp3YSkpDQpvdXQkemFfcm9rX3d5ZGFuaWEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9yb2tfd3lkYW5pYSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb2tfd3lkYW5pYSkpDQpvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSkpDQpvdXQkemFfc2VyaWFfd3lkYXduaWN6YSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfc2VyaWFfd3lkYXduaWN6YSkpDQpvdXQkdHdfbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCR0d19uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCR0d19uYXp3aXNrbykpDQpvdXQkdHdfaW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JHR3X2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfaW1pZSkpDQpvdXQkcHJhY293bmlrIDwtIGlmZWxzZShpcy5uYShvdXQkcHJhY293bmlrKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHByYWNvd25paykpDQpvdXQkemFfYWRub3RhY2plIDwtIGlmZWxzZShpcy5uYShvdXQkemFfYWRub3RhY2plKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2Fkbm90YWNqZSkpDQpvdXQkQk5fVVJMIDwtIGlmZWxzZShpcy5uYShvdXQkQk5fVVJMKSwnJyxhcy5jaGFyYWN0ZXIob3V0JEJOX1VSTCkpDQoNCm91dCAlJCUgIA0KICAgIHsgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpICYgQk5fVVJMPT1sYWcoQk5fVVJMLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBvdXQkc2FtZQ0Kb3V0JHNhbWVbMV0gPC0gMA0Kb3V0JGR6aWVsb25lIDwtIHBhc3RlKG91dCRhbV9hdXRvcl9pZCxvdXQkYW1fbmF6d2lza28sb3V0JGFtX2ltaWUsb3V0JG9zX29zb2JhX2lkLG91dCRvc19uYXp3aXNrbyxvdXQkb3NfaW1pZSxvdXQkZm9fc3ltYm9sLG91dCR3eV93eWRhd25pY3R3b19pZCxvdXQkd3lfbWllanNjZSxvdXQkd3lfbmF6d2Esc2VwID0gIiIpDQoNCm91dCA8LSBvdXQgJT4lDQogIGZpbHRlcighKHNhbWU9PTEmZHppZWxvbmU9PSIiKSkgJT4lDQogIHNlbGVjdCgxOjMzKQ0KDQpvdXQgJSQlICANCiAgICB7IHJla29yZF9CTj09bGFnKHJla29yZF9CTiwpICYgcnpfbmF6d2E9PWxhZyhyel9uYXp3YSwpICYgemFfcm9fcm9rPT1sYWcoemFfcm9fcm9rLCkgJiB6YV90eXBlPT1sYWcoemFfdHlwZSwpICYgcnpfcm9kemFqX2lkPT1sYWcocnpfcm9kemFqX2lkLCkgJiBEWl9OQVpXQT09bGFnKERaX05BWldBLCkgJiBEWl9EWklBTF9JRD09bGFnKERaX0RaSUFMX0lELCkgJiB0d190d29yY2FfaWQ9PWxhZyh0d190d29yY2FfaWQsKSAmIHphX3R5dHVsPT1sYWcoemFfdHl0dWwsKSAmIHphX3R5dHVsX29yeWdpbmFsdT09bGFnKHphX3R5dHVsX29yeWdpbmFsdSwpICYgemFfamV6eWtfb3J5Z2luYWx1PT1sYWcoemFfamV6eWtfb3J5Z2luYWx1LCkgJiB6YV9vcGlzX3dzcG9sdHdvcmNvdz09bGFnKHphX29waXNfd3Nwb2x0d29yY293LCkgJiB6YV93eWRhbmllPT1sYWcoemFfd3lkYW5pZSwpICYgemFfdG9teT09bGFnKHphX3RvbXksKSAmIHphX2luc3R5dHVjamE9PWxhZyh6YV9pbnN0eXR1Y2phLCkgJiB6YV9yb2tfd3lkYW5pYT09bGFnKHphX3Jva193eWRhbmlhLCkgJiB6YV9vcGlzX2Zpenljem55X2tzaWF6a2k9PWxhZyh6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksKSAmIHphX3NlcmlhX3d5ZGF3bmljemE9PWxhZyh6YV9zZXJpYV93eWRhd25pY3phLCkgJiB0d19uYXp3aXNrbz09bGFnKHR3X25hendpc2tvLCkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpICYgcHJhY293bmlrPT1sYWcocHJhY293bmlrLCkgJiB6YV9hZG5vdGFjamU9PWxhZyh6YV9hZG5vdGFjamUsKSAmIEJOX1VSTD09bGFnKEJOX1VSTCwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCg0KI3VjacSZY2llIHpieXQgZMWCdWdpY2ggY2nEhWfDs3cgem5ha8OzdywgYnkgd2VzesWCeSBkbyBvcmFjbGUnYQ0KZGx1Z29zY2kgPC0gZGF0YS5mcmFtZShwb2xlID0gYygiYW1fbmF6d2lza28iLCAiYW1faW1pZSIsICJ6YV90eXR1bCIsICJ6YV90eXR1bF9vcnlnaW5hbHUiLCAiemFfamV6eWtfb3J5Z2luYWx1IiwgIm9zX25hendpc2tvIiwgIm9zX2ltaWUiLCAiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCAiemFfaW5zdHl0dWNqYSIsICJ3eV9taWVqc2NlIiwgInd5X25hendhIiwgInphX29waXNfZml6eWN6bnlfa3NpYXpraSIsICJ6YV9zZXJpYV93eWRhd25pY3phIiwgInR3X25hendpc2tvIiwgInR3X2ltaWUiLCAiemFfYWRub3RhY2plIiksIGxpY3piYV96bmFrb3cgPSBjKDUwLDQwLDUwMCw1MDAsMTAwLDUwLDQwLDUwMCwyNTUsNDAsMjU1LDEwMDAsMjU1LDIwMCw0MCwyMDAwKSkNCnggPC0gbWF0Y2goZGx1Z29zY2kkcG9sZSxuYW1lcyhvdXQpKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBkbHVnb3NjIDwtIGRsdWdvc2NpJGxpY3piYV96bmFrb3dbbWF0Y2gobmFtZXMob3V0W2ldKSxkbHVnb3NjaSRwb2xlKV0NCiAgb3V0JHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpJm91dCR6YV9hZG5vdGFjamUhPSIiLHBhc3RlKG91dCR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBQb2xlICIsYXMuY2hhcmFjdGVyKG5hbWVzKG91dFtpXSkpLCIgYnnFgm8gemJ5dCBkxYJ1Z2llIGkgem9zdGHFgm8gcHJ6eWNpxJl0ZS4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpJm91dCR6YV9hZG5vdGFjamU9PSIiLHBhc3RlKCJVV0FHQSEgUG9sZSAiLGFzLmNoYXJhY3RlcihuYW1lcyhvdXRbaV0pKSwiIGJ5xYJvIHpieXQgZMWCdWdpZSBpIHpvc3RhxYJvIHByenljacSZdGUuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxhcy5jaGFyYWN0ZXIob3V0JHphX2Fkbm90YWNqZSkpKQ0KICANCiAgb3V0WyxpXSA8LSBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpLGFzLmNoYXJhY3RlcihzdWJzdHIob3V0WyxpXSwxLGRsdWdvc2MpKSxhcy5jaGFyYWN0ZXIob3V0WyxpXSkpDQp9DQoNCm91dCRyZWtvcmRfQk5bb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRyel9uYXp3YVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3JvX3Jva1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5cGVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRyel9yb2R6YWpfaWRbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCREWl9OQVpXQVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JERaX0RaSUFMX0lEW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfdHdvcmNhX2lkW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHl0dWxbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXR1bF9vcnlnaW5hbHVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9qZXp5a19vcnlnaW5hbHVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9vcGlzX3dzcG9sdHdvcmNvd1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3d5ZGFuaWVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90b215W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfaW5zdHl0dWNqYVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3Jva193eWRhbmlhW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfc2VyaWFfd3lkYXduaWN6YVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X25hendpc2tvW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfaW1pZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHByYWNvd25pa1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2Fkbm90YWNqZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JEJOX1VSTFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0KDQojcHJ6eXBpc2FuaWUgZG8gYXV0b21hdHljem5lZ28gT0sgcmVkYWt0b3JhICJhdXRvbWF0Ig0Kb3V0IDwtIG91dCAlPiUNCiAgbXV0YXRlKHByYWNvd25payA9IGlmZWxzZShyZWtvcmRfQk4gJWluJSBhdXRvbWF0eWN6bnlfSU9LJHJla29yZF9CTiwiQVVUT01BVCIsYXMuY2hhcmFjdGVyKHByYWNvd25paykpKSAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCiNwxJl0bGEgemFwaXN1asSFY2EgcG8gb2suIDIwMDAgd2llcnN6eSB6IHV3emdsxJlkbmllbmllbSBrb21wbGV0bm/Fm2NpIHJla29yZMOzdyBiaWJsaW9ncmFmaWN6bnljaCByb3pwaXNhbnljaCBuYSBraWxrYSB3aWVyc3p5DQpvdXQgPC0gb3V0ICU+JQ0KICBtdXRhdGUocG9kemlhbCA9IGlmZWxzZShyZWtvcmRfQk4hPSIiLGFzLmNoYXJhY3RlcihyZWtvcmRfQk4pLE5BKSkgJT4lDQogIGZpbGwocG9kemlhbCkNCmlsZSA8LSB1bmlxdWUob3V0JHBvZHppYWwpDQppbGUgPC0gc3BsaXQodW5pcXVlKGlsZSksIGNlaWxpbmcoc2VxX2Fsb25nKHVuaXF1ZShpbGUpKS8xNTAwKSkNCg0KeCA8LSAxOmxlbmd0aChpbGUpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGZpbmFsIDwtIG91dCAlPiUNCiAgICBmaWx0ZXIocG9kemlhbCAlaW4lIGlsZVtbaV1dKSAlPiUNCiAgICBzZWxlY3QoLXBvZHppYWwpDQogIHdyaXRlLnhsc3goZmluYWwsIHBhc3RlKCJDOi9Vc2Vycy9DZXphcnkvRGVza3RvcC8yMDA5X3BvZG1pb3Rvd2FfZG9faW1wb3J0dSIsaSwiLnhsc3giLHNlcCA9ICIiKSxzaGVldE5hbWUgPSAiZ290b3dlIikNCn0NCmBgYA0KDQpgYGB7ciBrc2nEhcW8a2kgcHJ6ZWRtaW90b3dlfQ0KZGF0YSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBwYXN0ZShyZWRha3Rvcl9kemlhbHUsIl9wcnplZG0iLHNlcCA9ICIiKSkNCiN1d29sbmllbmllIGtvbHVtbiB6IGRhbnltaSB6IGJuIGkgcHJ6ZXR3b3J6ZW5pZSBkbyBQQkwNCiMxOiB6YV91d2FnaSwgcnpfbmF6d2EsIHphX3JvX3JvaywgemFfdHlwZSwgcnpfcm9kemFqX2lkLCB0d190d29yY2FfaWQsIHR3X25hendpc2tvLCB0d19pbWllLCBkel9kemlhbF9pZCwgZHpfbmF6d2EsIHJlZGFrdG9yX2R6aWFsdQ0KcG9sYV9wYmwgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBSWl9OQVpXQSwgWkFfUk9fUk9LID0gcm9rLCBSWl9ST0RaQUpfSUQsIFRXX1RXT1JDQV9JRCwgVFdfTkFaV0lTS08sIFRXX0lNSUUsIERaX0RaSUFMX0lELCBEWl9OQVpXQSwgcmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgbXV0YXRlKFpBX1RZUEUgPSAiS1MiKQ0KIzI6IGF1dG9yDQpCTl9hdXRvciA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWDEwMCxYMjQ1LFpBX1VXQUdJKQ0KI3BvbGUgMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBCTl9hdXRvciAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoQk5fYXV0b3IkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KI3BvbGUgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBCTl9hdXRvciAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoQk5fYXV0b3IkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fYXV0b3IgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmApICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBpZmVsc2UoIWlzLm5hKGAkYmApLHBhc3RlKGAkYWAsYCRiYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoQU1fTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVtb3ZlX2FsbChgJGFgLCIsIiksIlxcfCIsIiwgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKGAkYWApKSksDQogICAgICAgICBBTV9JTUlFID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCIqIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMyIpLCIqIikpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUsIFgyNDVjID0gYCRjYCkNCiAgDQp4IDwtIDE6bGVuZ3RocyhCTl9hdXRvclsxXSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIEJOX2F1dG9yJGN6eV9uYXp3aXNrb1tpXSA8LSBncmVwbChCTl9hdXRvciRBTV9OQVpXSVNLT1tpXSxCTl9hdXRvciRYMjQ1Y1tpXSkNCiAgQk5fYXV0b3IkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fYXV0b3IkQU1fSU1JRVtpXSxCTl9hdXRvciRYMjQ1Y1tpXSkNCn0NCg0KQk5fYXV0b3IgPC0gQk5fYXV0b3IgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggMTAwIGkgMjQ1LiBQb3LDs3duYWogcG9sZSBhdXRvciB3IGZvcm11bGFyenUgeiBwb2xlbSBCTjogIixYMjQ1YyxzZXAgPSAiIiksTkEpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUsWkFfQUROT1RBQ0pFKSAlPiUNCiAgbXV0YXRlKG5hendhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihwYXN0ZShBTV9OQVpXSVNLTyxBTV9JTUlFLCBzZXAgPSAiIikpLCAiXFxXIiwgIiIpKSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX2F1dG9yenkgJT4lIHNlbGVjdChBTV9BVVRPUl9JRCxBTV9LUllQVE9OSU0sQU1fTElDWkJBX1pBUElTT1csbmF6d2EpICU+JSBmaWx0ZXIoaXMubmEoQU1fS1JZUFRPTklNKSksYnk9Im5hendhIikgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSwtQU1fTElDWkJBX1pBUElTT1cpDQpCTl9hdXRvciRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoQk5fYXV0b3JbMTozXSkpDQpCTl9hdXRvciA8LSBCTl9hdXRvclshZHVwbGljYXRlZChCTl9hdXRvciRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUsWkFfQUROT1RBQ0pFLEFNX0FVVE9SX0lEKQ0KDQojMzogdHl0dcWCDQojcG9sZSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKFpBX1RZVFVMID0gcGFzdGUoYCRhYCxgJGJgLGAkbmAsYCRwYCxzZXAgPSAiIikpDQoNCnphX3R5dHVsIDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBtdXRhdGUoWkFfVFlUVUwgPSBwYXN0ZShgJGFgLGAkYmAsYCRuYCxgJHBgLHNlcCA9ICIgIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZW1vdmUoWkFfVFlUVUwsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMKQ0KDQojNDogdHl0dcWCIG9yeWdpbmHFgnUNCiNwb2xlIDI0Ng0KbWFyY19maWVsZF8yNDYgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDYpJT4lDQogIGZpbHRlcihYMjQ2IT0iIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIn4iKSwNCiAgICAgICAgIFgyNDY9c3RyX3JlcGxhY2VfYWxsKFgyNDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ2IT0iIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ2PC1jYmluZChtYXJjX2ZpZWxkXzI0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NiRYMjQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ2JFgyNDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ2JFgyNDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NiRYMjQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2ICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWciLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIiKSwNCiAgICAgICAgIGAkcGAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRwYCksIiIsYXMuY2hhcmFjdGVyKGAkcGApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShYMjQ2ID0gcGFzdGUoYCRhYCxgJGJgLGAkbmAsYCRwYCxzZXAgPSAiIikpICU+JQ0KICBtdXRhdGUoWDI0NiA9IHN0cl9yZW1vdmUoWDI0NiwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCg0KI3BvbGUgNTAwDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwifiIpLA0KICAgICAgICAgWDUwMD1zdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDUwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzUwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81MDA8LWNiaW5kKG1hcmNfZmllbGRfNTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTAwJFg1MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81MDAkWDUwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81MDAkWDUwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTAwJFg1MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTAwIDwtIG1hcmNfZmllbGRfNTAwICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWdcXC5cXDoiLFg1MDApKSAlPiUNCiAgbXV0YXRlKFg1MDAgPSBzdHJfcmVtb3ZlKGAkYWAsIl5UeXRcXC4gb3J5Z1xcLjogfF5UeXRcXCwgb3J5Z1xcLjogfF4uKj90eXRcXC4gb3J5Z1xcLjogIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYNTAwID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApKSkpKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsICJcXC4kIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCIoLHswLDF9IHswLDF9KVxcZHs0fS4qJHwoLCB0fC4gVCl5dC4gb3J5Zy4gY3lrbHU6IikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCkNCiN0eXR1xYIgb3J5Z2luYcWCdQ0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ2LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzUwMCxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFg1MDAgPSBpZmVsc2UoaXMubmEoWDUwMCksTkEsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgib3J5ZyIsWDUwMCksTkEsYXMuY2hhcmFjdGVyKFg1MDApKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiXFwuIC0gIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gLSAuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJOYSBrc2nEhcW8Y2UgcHNldWQiLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiBOYSBrc2nEhcW8Y2UgcHNldWQuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJQcnpla8WCXFwuIHdnIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gUHJ6ZWvFglxcLiB3Zy4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWkFfVFlUVUxfT1JZR0lOQUxVID0gaWZlbHNlKGlzLm5hKFgyNDYpJmlzLm5hKFg1MDApLE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApLGFzLmNoYXJhY3RlcihYMjQ2KSkpLA0KICAgICAgICAgWkFfVFlUVUxfT1JZR0lOQUxVID0gc3RyX3JlbW92ZV9hbGwoWkFfVFlUVUxfT1JZR0lOQUxVLCdcXCInKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTF9PUllHSU5BTFUpDQojNTogasSZenlrIG9yeWdpbmHFgnUNCm1hcmNfZmllbGRfMDQxIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMDQxKSU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVwbGFjZV9hbGwoWDA0MSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMDQxIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgwNDEhPSIiKSAlPiUNCiAgbXV0YXRlKFgwNDE9c3RyX3JlbW92ZV9hbGwoWDA0MSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDA0MSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzA0MSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8wNDE8LWNiaW5kKG1hcmNfZmllbGRfMDQxLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMDQxJFgwNDEgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8wNDEkWDA0MSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8wNDFbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8wNDEkWDA0MSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMDQxJFgwNDEpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCnphX2plenlrX29yeWdpbmFsdSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzA0MSAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0pFWllLX09SWUdJTkFMVSA9IGAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWkFfSkVaWUtfT1JZR0lOQUxVID0gc3RyX3JlcGxhY2VfYWxsKFpBX0pFWllLX09SWUdJTkFMVSwiXFwkYSIsIiwiKSkgJT4lDQogIHVuaXF1ZSgpDQoNCiM2OiB3c3DDs8WCdHfDs3JjeQ0KbWFyY19maWVsZF83MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoLi5cXCRhKSIsInxcXDEiKSwNCiAgICAgICAgIFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCkJOX3dzcG9sdHdvcmNhIDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3NvYmEgPSBgJGFgLGZ1bmtjamEgPSBgJGVgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShmdW5rY2phKSkgJT4lDQogIG11dGF0ZShvc29iYSA9IHN0cl9yZW1vdmUob3NvYmEsIig/PD1bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIiksDQogICAgICAgICBPU19OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiLCIsb3NvYmEpLHN0cl9yZXBsYWNlX2FsbChvc29iYSwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3Rlcihvc29iYSkpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShncmVwbCgiLCIsb3NvYmEpLHN0cl9yZXBsYWNlX2FsbChvc29iYSwiKC4qPykoLCApKC4qKSIsIlxcMyIpLCIqIiksDQogICAgICAgICB3c19wcm9zdHkgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKG9zb2JhKSwgIlxcVyIsICIiKSwNCiAgICAgICAgIGZ1X3Byb3N0YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIoZnVua2NqYSksICJcXFciLCAiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3Nwb2x0d29yY3kgJT4lIHNlbGVjdChPU19PU09CQV9JRCxPU19MSUNaQkFfWkFQSVNPVyxuYXp3YV9wcm9zdGEpLGJ5PWMoIndzX3Byb3N0eSI9Im5hendhX3Byb3N0YSIpKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLC1PU19MSUNaQkFfWkFQSVNPVykNCkJOX3dzcG9sdHdvcmNhJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChCTl93c3BvbHR3b3JjYVsxOjJdKSkNCkJOX3dzcG9sdHdvcmNhIDwtIEJOX3dzcG9sdHdvcmNhWyFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhJGlkX2dydXB5KSxdICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfZnVua2NqZSxieT1jKCJmdV9wcm9zdGEiPSJuYXp3YSIpKSAlPiUNCiAgbXV0YXRlKGZvX3N5bWJvbCA9IGlmZWxzZShmb19zeW1ib2w9PSJOVUxMIixOQSxhcy5jaGFyYWN0ZXIoZm9fc3ltYm9sKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksT1NfTkFaV0lTS08sT1NfSU1JRSxPU19PU09CQV9JRCxmb19zeW1ib2wsZm9fbmF6d2EsZnVua2NqYSkNCg0KI3R1dGFqIHByemVzenVrYcSHIFgyNDUgaSB6bmFsZcW6xIcgYsWCxJlkeSB3c3DDs8WCdHfDs3Jjw7N3DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NWM9YCRjYCkNCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ1LGJ5PSJaQV9VV0FHSSIpDQoNCnggPC0gMTpsZW5ndGhzKEJOX3dzcG9sdHdvcmNhWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgQk5fd3Nwb2x0d29yY2EkY3p5X25hendpc2tvW2ldIDwtIHN0cl9kZXRlY3QoQk5fd3Nwb2x0d29yY2EkWDI0NWNbaV0sQk5fd3Nwb2x0d29yY2EkT1NfTkFaV0lTS09baV0pDQogIEJOX3dzcG9sdHdvcmNhJGN6eV9pbWllW2ldIDwtIGdyZXBsKEJOX3dzcG9sdHdvcmNhJE9TX0lNSUVbaV0sQk5fd3Nwb2x0d29yY2EkWDI0NWNbaV0pDQp9DQoNCkJOX3dzcG9sdHdvcmNhIDwtIEJOX3dzcG9sdHdvcmNhICU+JQ0KICBtdXRhdGUoWkFfQUROT1RBQ0pFID0gaWZlbHNlKGN6eV9uYXp3aXNrbz09RkFMU0V8Y3p5X2ltaWU9PUZBTFNFLHBhc3RlKCJVV0FHQSEgS29uZmxpa3QgdyBkYW55Y2ggb3NvYm93eWNoIHcgcG9sYWNoIDcwMCBpIDI0NS4gUG9yw7N3bmFqIHBvbGEgd3Nww7PFgnTDs3Jjw7N3IHcgZm9ybXVsYXJ6dSB6IHBvbGVtIEJOOiAiLFgyNDVjLHNlcCA9ICIiKSxOQSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksT1NfTkFaV0lTS08sT1NfSU1JRSxPU19PU09CQV9JRCxmb19zeW1ib2wsZm9fbmF6d2EsZnVua2NqYSxaQV9BRE5PVEFDSkUpDQoNCiM3OiBvcGlzIHdzcMOzxYJ0d8OzcmPDs3cNCm9waXNfd3Nwb2x0d29yY293IDwtIEJOX3dzcG9sdHdvcmNhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPKSAlPiUNCiAgZnVsbF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikgJT4lDQogIGZpbHRlcighaXMubmEoT1NfTkFaV0lTS08pfChpcy5uYShPU19OQVpXSVNLTykmZ3JlcGwoImV0IGFsXFwuIixYMjQ1YykpKSAlPiUNCiAgbXV0YXRlKGplc3RfZXRfYWwgPSBncmVwbCgiZXQgYWxcXC4iLFgyNDVjKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoT1NfSU1JRT09IioiLCIiLGFzLmNoYXJhY3RlcihPU19JTUlFKSksDQogICAgICAgICBvcGlzID0gaWZlbHNlKCFpcy5uYShPU19OQVpXSVNLTykscGFzdGUoZnVua2NqYSxPU19JTUlFLCBPU19OQVpXSVNLTywgc2VwID0gIiAiKSwiIiksDQogICAgICAgICBvcGlzID0gc3RyX3JlcGxhY2VfYWxsKG9waXMsIiArIiwiICIpLA0KICAgICAgICAgb3BpcyA9IGlmZWxzZShvcGlzPT0iICIsIiIsYXMuY2hhcmFjdGVyKG9waXMpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzLGplc3RfZXRfYWwpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShvcGlzID0gcGFzdGUob3Bpcyxjb2xsYXBzZSA9ICIsICIpLA0KICAgICAgICAgamVzdF9ldF9hbCA9IHBhc3RlKHVuaXF1ZShqZXN0X2V0X2FsKSxzZXAgPSAiIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUob3BpcyA9IGlmZWxzZShqZXN0X2V0X2FsPT1UUlVFJm9waXM9PSIiLCJldCBhbC4iLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoamVzdF9ldF9hbCxwYXN0ZShvcGlzLCJldCBhbC4iLHNlcCA9ICIgIiksb3BpcykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMpDQoNCiM3MDANCm1hcmNfZmllbGRfNzAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNzAwKSU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKC4uXFwkYSkiLCJ8XFwxIiksDQogICAgICAgICBYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg3MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVtb3ZlX2FsbChYNzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg3MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkgJT4lDQogIGZpbHRlcihYNzAwIT0iIikNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzcwMDwtY2JpbmQobWFyY19maWVsZF83MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF83MDAkWDcwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzcwMCRYNzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzcwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzcwMCRYNzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF83MDAkWDcwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF83MDAgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvc29iYSA9IGAkYWAsZnVua2NqYSA9IGAkZWApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGZ1bmtjamEpKSAlPiUNCiAgbXV0YXRlKG9zb2JhID0gc3RyX3JlbW92ZShvc29iYSwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSwNCiAgICAgICAgIE9TX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKG9zb2JhKSksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSwNCiAgICAgICAgIGZ1bmtjamFfZHV6YSA9IHN0cl90b19sb3dlcihmdW5rY2phKSwNCiAgICAgICAgIG9waXMgPSBwYXN0ZShmdW5rY2phX2R1emEsT1NfSU1JRSxPU19OQVpXSVNLTywgc2VwID0gIiAiKSwNCiAgICAgICAgIG9waXNfZHV6eSA9IHBhc3RlKGZ1bmtjamEsT1NfSU1JRSxPU19OQVpXSVNLTywgc2VwID0gIiAiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzLG9waXNfZHV6eSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBwYXN0ZShvcGlzLGNvbGxhcHNlID0gIi4gIiksDQogICAgICAgICBvcGlzX2R1enkgPSBwYXN0ZShvcGlzX2R1enksY29sbGFwc2UgPSAiLiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkNCg0KI29waXMgd3Nww7PFgnR3w7NyY8OzdyB6ZSBzdHJlZnkgb2Rwb3dpZWR6aWFsbm/Fm2NpIDI0NQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkY2ApDQoNCiNwb3LDs3duYW5pZSBvcGlzdSB3c3DDs8WCdHfDs3Jjw7N3IHogMjQ1IGkgNzAwDQp3c3BvbHR3b3JjeSA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgZnVsbF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikgJT4lDQogIGNTcGxpdCguLCIkYyIsc2VwID0gIiA7ICIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgI29ncmFuaWN6YW5pZSBvc8OzYiB6ZSBzdHJlZnkgb2Rwb3dpZWR6aWFsbm/Fm2NpDQogIG11dGF0ZShjenlfbWFsYSA9IGdyZXBsKCIgW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XlthLXrEmcOzxIXFm8WCxbzFusSHxYRdfFxcW1thLXrEmcOzxIXFm8WCxbzFusSHxYRdIixgJGNgLGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUNCiAgZmlsdGVyKGN6eV9tYWxhPT1UUlVFKSAlPiUNCiAgc2VsZWN0KC1jenlfbWFsYSkgJT4lDQogICNtdXRhdGUoYCRjYCA9IGdzdWIoIl4oXFxbKXswLDF9KFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiLCJcXDFcXFVcXDIiLHBlcmwgPSBUUlVFLGAkY2ApKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoWDI0NSA9IHBhc3RlKGAkY2AsIGNvbGxhcHNlID0gIiwgIikpICU+JQ0KICBzZWxlY3QoLWAkY2ApICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKG9yZGVyX3BibCA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwob3BpcywiKD88PV58IHxcXFt8LSkoW0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9YS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIikpLA0KICAgICAgICAgb3JkZXJfcGJsID0gc3RyX3JlcGxhY2VfYWxsKG9yZGVyX3BibCwiKC4qP1wiKSguKShcIi4qPy4pIiwgIlxcMiIpLA0KICAgICAgICAgb3JkZXJfYm4gPSBhcy5jaGFyYWN0ZXIoc3RyX2V4dHJhY3RfYWxsKFgyNDUsIig/PD1efCB8XFxbfC0pKFtBLVpBw4HDgMOCw4PDhMSCxIDDhcSEw4ZFw4nDiMOKw4vEmsSSxJbEmEnDjcOMw47Dj8SqxK5JT8OTw5LDlMOVw5bFkMOYxZJVw5rDmcObw5zFsMWqxa9Zw51DxIbEjMOnRMSOxJDEkEfEosSeS8S2TMWBxLtOxYPDkcWHxYXFilLFmFPFmsWgxZ5Tw59UxaTFpsOexaI4WsW7xbnFvWEtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIpKSwNCiAgICAgICAgIG9yZGVyX2JuID0gc3RyX3JlcGxhY2VfYWxsKG9yZGVyX2JuLCIoLio/XCIpKC4pKFwiLio/LikiLCAiXFwyIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFwuJCIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwgIlxcWyIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwgIlxcXSIpLA0KICAgICAgICAgb3JkZXJfcGJsID0gc3RyX3JlbW92ZV9hbGwob3JkZXJfcGJsLCAiW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dIiksDQogICAgICAgICBvcmRlcl9ibiA9IHN0cl9yZW1vdmVfYWxsKG9yZGVyX2JuLCAiW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dIiksDQogICAgICAgICB0b19zYW1vID0gb3JkZXJfcGJsPT1vcmRlcl9ibiwNCiAgICAgICAgIFgyNDUgPSBnc3ViKCIoXlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoLiopIiwiXFxVXFwxXFxFXFwyIixwZXJsID0gVFJVRSwgWDI0NSkpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9qZXp5a19vcnlnaW5hbHUsYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShjenlfcGwgPSBncmVwbCgicG9sIixaQV9KRVpZS19PUllHSU5BTFUpfGlzLm5hKFpBX0pFWllLX09SWUdJTkFMVSksDQogICAgICAgICBkZWN5emphID0gaWZlbHNlKHRvX3NhbW89PUZBTFNFfGN6eV9wbD09RkFMU0UsRkFMU0UsVFJVRSkpDQoNCnphX29waXNfd3Nwb2x0d29yY293IDwtIHdzcG9sdHdvcmN5ICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBpZmVsc2UoZGVjeXpqYT09VFJVRSxhcy5jaGFyYWN0ZXIoWDI0NSkscGFzdGUoWDI0NSxvcGlzX2R1enksc2VwID0gIiMiKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3Bpc19kdXp5LHphX29waXNfd3Nwb2x0d29yY293KSAlPiUNCiAgY1NwbGl0KC4sInphX29waXNfd3Nwb2x0d29yY293IixzZXAgPSAiIyIsZGlyZWN0aW9uID0gIndpZGUiKSAlPiUNCiAgbXV0YXRlKHphX29waXNfd3Nwb2x0d29yY293XzIgPSBpZmVsc2UoaXMubmEoemFfb3Bpc193c3BvbHR3b3Jjb3dfMiksJycsYXMuY2hhcmFjdGVyKHphX29waXNfd3Nwb2x0d29yY293XzIpKSwNCiAgICAgICAgIHRvX3NhbW8gPSB6YV9vcGlzX3dzcG9sdHdvcmNvd18xPT16YV9vcGlzX3dzcG9sdHdvcmNvd18yKSAlPiUNCiAgZmlsdGVyKHRvX3NhbW89PUZBTFNFKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBwYXN0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvd18xLHphX29waXNfd3Nwb2x0d29yY293XzIsc2VwID0gIiMiKSwNCiAgICAgICAgIHphX29waXNfd3Nwb2x0d29yY293ID0gc3RyX3JlbW92ZV9hbGwoemFfb3Bpc193c3BvbHR3b3Jjb3csIlxcIyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSx6YV9vcGlzX3dzcG9sdHdvcmNvdykNCg0Kb3Bpc193c3BvbHR3b3Jjb3cgPC0gb3Bpc193c3BvbHR3b3Jjb3cgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIHphX29waXNfd3Nwb2x0d29yY293JFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShvcGlzKSkgJT4lDQogIHJlbmFtZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IG9waXMpDQoNCnphX29waXNfd3Nwb2x0d29yY293IDwtIHphX29waXNfd3Nwb2x0d29yY293ICU+JQ0KICBiaW5kX3Jvd3MoLixvcGlzX3dzcG9sdHdvcmNvdykgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiM4IHd5ZGFuaWUNCm1hcmNfZmllbGRfMjUwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjUwKSU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVwbGFjZV9hbGwoWDI1MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjUwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNTAhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNTA9c3RyX3JlbW92ZV9hbGwoWDI1MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI1MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI1MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNTA8LWNiaW5kKG1hcmNfZmllbGRfMjUwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjUwJFgyNTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNTAkWDI1MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNTAkWDI1MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjUwJFgyNTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KemFfd3lkYW5pZSA8LSBtYXJjX2ZpZWxkXzI1MCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCB3eWRhbmllID0gYCRhYCkgJT4lDQogIG11dGF0ZSh3eWRhbmllID0gc3RyX3JlbW92ZSh3eWRhbmllLCIgXFwvJCIpKSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzk6IGluc3R5dHVjamEgc3ByYXdjemENCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NWM9YCRjYCkgJT4lDQogIGZpbHRlcighaXMubmEoWDI0NWMpKSAlPiUNCiAgbXV0YXRlKGluc3R5dHVjamEgPSBpZmVsc2UoZ3JlcGwoIlxcOyIsWDI0NWMpLHN0cl9yZXBsYWNlX2FsbChYMjQ1YywgIiguKj8pKFxcOyg/IS4qXFw7KSkoICkrKC4qPyQpIiwiXFw0IiksIiIpKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoemFfaW5zdHl0dWNqYVsxXSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHphX2luc3R5dHVjamEkY3p5X25hendpc2tvW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfTkFaV0lTS09baV0semFfaW5zdHl0dWNqYSRYMjQ1Y1tpXSkNCiAgemFfaW5zdHl0dWNqYSRjenlfaW1pZVtpXSA8LSBncmVwbCh6YV9pbnN0eXR1Y2phJE9TX0lNSUVbaV0semFfaW5zdHl0dWNqYSRYMjQ1Y1tpXSkNCn0NCg0KemFfaW5zdHl0dWNqYSA8LSB6YV9pbnN0eXR1Y2phICU+JQ0KICBmaWx0ZXIoaXMubmEoY3p5X25hendpc2tvKSZpcy5uYShjenlfaW1pZSkpICU+JQ0KICBmaWx0ZXIoaW5zdHl0dWNqYSE9IiIpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJeXFxbW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dfF5bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iLGluc3R5dHVjamEpKSAlPiUNCiAgbXV0YXRlKGluc3R5dHVjamEgPSBzdHJfcmVtb3ZlKGluc3R5dHVjamEsIlxcLiQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxpbnN0eXR1Y2phKSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzEwOiB3eWRhd25pY3R3bw0KQk5fd3lkYXduaWN0d28gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBYMjYwKSAlPiUNCiAgbXV0YXRlKFgyNjAgPSBzdHJfcmVwbGFjZV9hbGwoWDI2MCwic1xcLm5cXC4iLCAiYi53LiIpLCANCiAgICAgICAgIFgyNjAgPSBzdHJfcmVwbGFjZV9hbGwoWDI2MCwic1xcLmxcXC4iLCAiYi5tLiIpLCANCiAgICAgICAgIFgyNjAgPSBzdHJfcmVwbGFjZV9hbGwoWDI2MCwiU1xcLmxcXC4iLCAiYi5tLiIpLCANCiAgICAgICAgIFgyNjAgPSBzdHJfcmVtb3ZlKFgyNjAsIl5cXFxcKyIpLCANCiAgICAgICAgIHJva193eWRhbmlhID0gc3RyX2V4dHJhY3RfYWxsKFgyNjAsICIoPzw9XFwkYykuKig/PVxcJGUpfCg/PD1cXCRjKS4qIiksIA0KICAgICAgICAgYmV6X3Jva3UgPSBzdHJfcmVwbGFjZV9hbGwoWDI2MCwgIi5cXCRjLioiLCAiIiksIA0KICAgICAgICAgaWxlX3d5ZGF3bmljdHcgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRiIiksDQogICAgICAgICBpbGVfbWllanNjID0gc3RyX2NvdW50KGJlel9yb2t1LCAiXFwkYSIpLA0KICAgICAgICAga29sZWpub3NjID0gc3RyX3JlcGxhY2VfYWxsKGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoYmV6X3Jva3UsICJcXCQuIikpLCAiW15hLXpdIiwgIiIpLA0KICAgICAgICAgYmV6X3Jva3UgPSBzdHJfcmVwbGFjZV9hbGwoYmV6X3Jva3UsICI7XFwkYiIsICI6JGIiKSwNCiAgICAgICAgIHd5ZGF3X3BvZHppZWwgPSBpZmVsc2UoaWxlX3d5ZGF3bmljdHc+aWxlX21pZWpzY3xrb2xlam5vc2M9PSJjYWFiYiIsIHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIihcXCRhKSguKj8pKCA6XFwkYi4qPykoIDpcXCRiKSIsICJcXDFcXDJcXDMgOyRhXFwyXFw0IiksYmV6X3Jva3UpLA0KICAgICAgICAgd3lkYXduaWN0d29fdGVzdCA9IHN0cl9yZXBsYWNlX2FsbCh3eWRhd19wb2R6aWVsLCAiKFxcJGIpKC4qPykoIDtcXCRhKSIsICJcXDFcXDJ8XFwzIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kscm9rX3d5ZGFuaWEsd3lkYXduaWN0d29fdGVzdCkgJT4lDQogIGNTcGxpdCguLCAid3lkYXduaWN0d29fdGVzdCIsIHNlcCA9ICJ8IiwgZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgbXV0YXRlKHd5ZGF3bmljdHdvID0gc3RyX2V4dHJhY3RfYWxsKHd5ZGF3bmljdHdvX3Rlc3QsICIoPzw9XFwkYikoLiopIiksDQogICAgICAgICBtaWVqc2NlX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX2V4dHJhY3RfYWxsKHd5ZGF3bmljdHdvX3Rlc3QsICIoPzw9XFwkYSkoLiopKD89IHswLDF9OiB7MCwxfVxcJGIpfCg/PD1cXCRhKSguKikoJCkiKSwiIDtcXCRhIiwgIiwgIiksDQogICAgICAgICBuYXp3YV9wcm9zdGEgPSBzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbCh1bmxpc3Qod3lkYXduaWN0d29fdGVzdCksICJcXCRcXHciLCAiIiksICJcXFciLCAiIikpKSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX3d5ZGF3bmljdHdhLGJ5PSJuYXp3YV9wcm9zdGEiKSAlPiUNCiAgbXV0YXRlKHRvX3NhbW8gPSB3eWRhd25pY3R3bz09V1lfTkFaV0EpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLC10b19zYW1vLC1XWV9MSUNaQkFfWkFQSVNPVykNCkJOX3d5ZGF3bmljdHdvJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChCTl93eWRhd25pY3R3b1sxOjNdKSkNCkJOX3d5ZGF3bmljdHdvIDwtIEJOX3d5ZGF3bmljdHdvWyFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvJGlkX2dydXB5KSxdICU+JQ0KICBtdXRhdGUoV1lfTkFaV0EgPSBpZmVsc2UoIWlzLm5hKFdZX05BWldBKSxhcy5jaGFyYWN0ZXIoV1lfTkFaV0EpLGFzLmNoYXJhY3Rlcih3eWRhd25pY3R3bykpLA0KICAgICAgICAgV1lfTUlBU1RPID0gaWZlbHNlKCFpcy5uYShXWV9NSUFTVE8pLGFzLmNoYXJhY3RlcihXWV9NSUFTVE8pLGFzLmNoYXJhY3RlcihtaWVqc2NlX3d5ZGFuaWEpKSwNCiAgICAgICAgIHJva193eWRhbmlhID0gc3RyX3JlcGxhY2VfYWxsKHJva193eWRhbmlhLCAiKC4qKShcXC4pIiwgIlxcMSIpLA0KICAgICAgICAgemFfcm9rX3d5ZGFuaWEgPSBpZmVsc2UobmNoYXIocm9rX3d5ZGFuaWEpPT00LGFzLmNoYXJhY3Rlcihyb2tfd3lkYW5pYSksTkEpLA0KICAgICAgICAgZG9fb3Bpc3UgPSBpZmVsc2UoaXMubmEoemFfcm9rX3d5ZGFuaWEpLHBhc3RlKCJbIixzdHJfZXh0cmFjdChyb2tfd3lkYW5pYSwiXFxkezR9IiksIl0iLHNlcCA9ICIiKSwiIiksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2Uoc3Vic3RyKFdZX01JQVNUTywxLDEpPT0iWyImc3Vic3RyKFdZX01JQVNUTyxuY2hhcihXWV9NSUFTVE8pLG5jaGFyKFdZX01JQVNUTykpIT0iXSImaXMubmEoV1lfV1lEQVdOSUNUV09fSUQpLHBhc3RlKHRyaW0oV1lfTUlBU1RPKSwiXSIsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihXWV9NSUFTVE8pKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxXWV9XWURBV05JQ1RXT19JRCxXWV9OQVpXQSxXWV9NSUFTVE8semFfcm9rX3d5ZGFuaWEsZG9fb3Bpc3UpDQoNCiMxMTogb3BpcyBmaXp5Y3pueSBrc2nEhcW8a2kNCiNwb2xlIDMwMCBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzMwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDMwMCklPiUNCiAgZmlsdGVyKFgzMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgzMDA9c3RyX3JlcGxhY2VfYWxsKFgzMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDMwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMzAwIT0iIikgJT4lDQogIG11dGF0ZShYMzAwPXN0cl9yZW1vdmVfYWxsKFgzMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDMwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgzMDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8zMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMzAwPC1jYmluZChtYXJjX2ZpZWxkXzMwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzMwMCRYMzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMzAwJFgzMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMzAwJFgzMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzMwMCRYMzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzMwMCA8LSBtYXJjX2ZpZWxkXzMwMCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkYmAgPSBzdHJfcmVtb3ZlKGAkYmAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkZWAgPSBpZmVsc2UoZ3JlcGwoIkNELVJPTXxEVkR8VkNEfENEIixgJGVgKSZncmVwbCgiXFwrIGR5c2t8cMWCeXQiLGAkZWApLHN0cl9leHRyYWN0KGAkZWAsIig/PD1cXCspKGR5c2t8cMWCeXQuKj8pKENELVJPTXxEVkR8VkNEfENEKShcXCkpezAsMX0iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJDRC1ST018RFZEfFZDRHxDRCIsYCRlYCksc3RyX2V4dHJhY3QoYCRlYCwiKF4uKj8pKENELVJPTXxEVkR8VkNEfENEKShcXCkpezAsMX0iKSxOQSkpLA0KICAgICAgICAgYCRhYCA9IGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLA0KICAgICAgICAgYCRiYCA9IGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLA0KICAgICAgICAgYCRlYCA9IGlmZWxzZShpcy5uYShgJGVgKSwiIixhcy5jaGFyYWN0ZXIoYCRlYCkpKQ0KI3BvbGUgNTAwIGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfNTAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKSU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDUwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzUwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81MDA8LWNiaW5kKG1hcmNfZmllbGRfNTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTAwJFg1MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81MDAkWDUwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81MDAkWDUwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTAwJFg1MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTAwIDwtIG1hcmNfZmllbGRfNTAwICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJvcnlnKFxcLnxcXCwpIixYNTAwKSZncmVwbCgicHNldWR8bmF6d2F8ZG90eWN6fHBvbCIsWDUwMCxpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCiAgDQojcG9sZSA1NDYgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF81NDYgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1NDYpJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZXBsYWNlX2FsbChYNTQ2LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1NDYiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDU0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDU0Nj1zdHJfcmVtb3ZlX2FsbChYNTQ2LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1NDYsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTQ2LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTQ2KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzU0NjwtY2JpbmQobWFyY19maWVsZF81NDYsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81NDYkWDU0NiA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzU0NiRYNTQ2LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzU0NlssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzU0NiRYNTQ2KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81NDYkWDU0NiksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81NDYgPC0gbWFyY19maWVsZF81NDYgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIikpDQoNCnphX29waXNfa3MgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxkb19vcGlzdSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMzAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDMwMGE9YCRhYCxYMzAwYj1gJGJgLFgzMDBlPWAkZWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzUwMCAlPiUgc2VsZWN0KFpBX1VXQUdJLFg1MDBhPWAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzU0NiAlPiUgc2VsZWN0KFpBX1VXQUdJLFg1NDZhPWAkYWApLGJ5PSJaQV9VV0FHSSIpDQp6YV9vcGlzX2tzW2lzLm5hKHphX29waXNfa3MpXSAgPC0gIiINCnphX29waXNfa3MgPC0gemFfb3Bpc19rcyAlPiUNCiAgbXV0YXRlKHphX29waXNfa3MgPSBwYXN0ZShpZmVsc2UoZG9fb3Bpc3UhPSIiLHBhc3RlKGFzLmNoYXJhY3Rlcihkb19vcGlzdSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwYSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBhKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBiIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGIpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGUhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwZSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYNTAwYSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFg1MDBhKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFg1NDZhIT0iIixhcy5jaGFyYWN0ZXIoWDU0NmEpLCIiKSxzZXAgPSAiIiksDQogICAgICAgICB6YV9vcGlzX2tzID0gc3RyX3JlbW92ZSh6YV9vcGlzX2tzLCIoLCApKyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSx6YV9vcGlzX2tzKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKHphX29waXNfa3MpKQ0KemFfb3Bpc19rcyRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoemFfb3Bpc19rc1sxXSkpDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3NbIWR1cGxpY2F0ZWQoemFfb3Bpc19rcyRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzEyOiBzZXJpYSB3eWRhd25pY3phDQptYXJjX2ZpZWxkXzQ5MCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCxYODAwLFg4MzApICU+JQ0KICBtdXRhdGUoWDQ5MCA9IGlmZWxzZShncmVwbCgiVVxcKyIsWDQ5MCksYXMuY2hhcmFjdGVyKFg4MzApLGFzLmNoYXJhY3RlcihYNDkwKSkpICU+JQ0KICBtdXRhdGUoWDgwMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgwMCkpLA0KICAgICAgICAgWDgzMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgzMCkpLA0KICAgICAgICAgWDgwMCA9IHN0cl9yZXBsYWNlKFg4MDAsIihcXCRhKSguKikoXFwkdCkiLCJcXDEiKSwNCiAgICAgICAgIFg0OTAgPSBpZmVsc2UoWDQ5MD09IiImWDgzMCE9IiIsYXMuY2hhcmFjdGVyKFg4MzApLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDQ5MD09IiImWDgwMCE9IiIsYXMuY2hhcmFjdGVyKFg4MDApLGFzLmNoYXJhY3RlcihYNDkwKSkpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg0OTApICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVwbGFjZV9hbGwoWDQ5MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNDkwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg0OTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg0OTA9c3RyX3JlbW92ZV9hbGwoWDQ5MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDQ5MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzQ5MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF80OTA8LWNiaW5kKG1hcmNfZmllbGRfNDkwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNDkwJFg0OTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF80OTAkWDQ5MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF80OTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF80OTAkWDQ5MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNDkwJFg0OTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCnphX3NlcmlhX3d5ZGF3bmljemEgPC0gbWFyY19maWVsZF80OTAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlcGxhY2VfYWxsKGAkYWAsIig9KShcXCRhKSIsIlxcMSAiKSwNCiAgICAgICAgIGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkdmAgPSBpZmVsc2UoaXMubmEoYCR2YCksIiIsYXMuY2hhcmFjdGVyKGAkdmApKSkgJT4lDQogIGZpbHRlcighaXMubmEoYCRhYCkpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBzdHJfcmVtb3ZlKHBhc3RlKCIoIixgJGFgLCI7ICIsYCR2YCwiKSIsc2VwID0gIiIpLCI7ICg/PVxcKSQpIiksDQogICAgICAgICBzZXJpYSA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxzZXJpYSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksc2VyaWEpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHBhc3RlKHNlcmlhLGNvbGxhcHNlID0gIiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZXBsYWNlX2FsbChzZXJpYSwiXFwkLiIsIjsgIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTM6IHRvbXkNCnphX3RvbXkgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHphX3RvbXkgPSBOQSkNCg0KIzE0OiBhZG5vdGFjamUNCnphX2Fkbm90YWNqZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvciAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IHBhc3RlKGlmZWxzZShpcy5uYShaQV9BRE5PVEFDSkUueCksIiIscGFzdGUoYXMuY2hhcmFjdGVyKFpBX0FETk9UQUNKRS54KSwiIyAiLHNlcCA9ICIiKSksaWZlbHNlKGlzLm5hKFpBX0FETk9UQUNKRS55KSwiIixhcy5jaGFyYWN0ZXIoWkFfQUROT1RBQ0pFLnkpKSxzZXAgPSAiIiksDQogICAgICAgICBaQV9BRE5PVEFDSkUgPSBzdHJfcmVtb3ZlKFpBX0FETk9UQUNKRSwiKCMgKSskIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKFpBX0FETk9UQUNKRSkpDQp6YV9hZG5vdGFjamUkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZVsxXSkpDQp6YV9hZG5vdGFjamUgPC0gemFfYWRub3RhY2plWyFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZSRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzE1OiBCTl9VUkwNCkJOX1VSTCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQk5fVVJMKQ0KDQojd3lyw7N3bmFuaWUgbGljemJ5IHdpZXJzenkgZG8gbGljemJ5IHdpZXJzenkgb2JpZWt0dSBkYXRhDQpCTl9hdXRvciA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvciAlPiUgc2VsZWN0KFpBX1VXQUdJLEFNX0FVVE9SX0lELEFNX05BWldJU0tPLEFNX0lNSUUpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBBTV9BVVRPUl9JRCA9IHBhc3RlKEFNX0FVVE9SX0lELCBjb2xsYXBzZT0ifCIpLCBBTV9OQVpXSVNLTyA9IHBhc3RlKEFNX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBBTV9JTUlFID0gcGFzdGUoQU1fSU1JRSwgY29sbGFwc2U9InwiKSkNCkJOX3dzcG9sdHdvcmNhIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksT1NfT1NPQkFfSUQsT1NfTkFaV0lTS08sT1NfSU1JRSxmb19zeW1ib2wpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBPU19PU09CQV9JRCA9IHBhc3RlKE9TX09TT0JBX0lELCBjb2xsYXBzZT0ifCIpLCBPU19OQVpXSVNLTyA9IHBhc3RlKE9TX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBPU19JTUlFID0gcGFzdGUoT1NfSU1JRSwgY29sbGFwc2U9InwiKSwgZm9fc3ltYm9sID0gcGFzdGUoZm9fc3ltYm9sLCBjb2xsYXBzZT0ifCIpKSAlPiUNCiAgbXV0YXRlKGZvX3N5bWJvbCA9IGlmZWxzZShmb19zeW1ib2w9PSJOVUxMIiwiTkEiLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkNCkJOX3d5ZGF3bmljdHdvIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvICU+JSBzZWxlY3QoWkFfVVdBR0ksV1lfV1lEQVdOSUNUV09fSUQsV1lfTkFaV0EsV1lfTUlBU1RPLHphX3Jva193eWRhbmlhKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZGRwbHkoLiwgLihaQV9VV0FHSSksIHN1bW1hcml6ZSwgV1lfV1lEQVdOSUNUV09fSUQgPSBwYXN0ZShXWV9XWURBV05JQ1RXT19JRCwgY29sbGFwc2U9InwiKSwgV1lfTkFaV0EgPSBwYXN0ZShXWV9OQVpXQSwgY29sbGFwc2U9InwiKSwgV1lfTUlBU1RPID0gcGFzdGUoV1lfTUlBU1RPLCBjb2xsYXBzZT0ifCIpLCB6YV9yb2tfd3lkYW5pYSA9IHBhc3RlKHVuaXF1ZSh6YV9yb2tfd3lkYW5pYSksIGNvbGxhcHNlPSJ8IikpICU+JQ0KICBtdXRhdGUoemFfcm9rX3d5ZGFuaWEgPSBpZmVsc2UoemFfcm9rX3d5ZGFuaWE9PSJOQSIsIiIsYXMuaW50ZWdlcih6YV9yb2tfd3lkYW5pYSkpKQ0KDQojcG/FgsSFY3plbmllIHdzenlzdGtpY2ggZWxlbWVudMOzdyB3IGplZG7EhSB0YWJlbMSZDQprb2xlam5vc2MgPC0gYygiWkFfVVdBR0kiLCJSWl9OQVpXQSIsIlpBX1JPX1JPSyIsIlpBX1RZUEUiLCJSWl9ST0RaQUpfSUQiLCJEWl9OQVpXQSIsIkRaX0RaSUFMX0lEIiwiVFdfVFdPUkNBX0lEIiwiQU1fQVVUT1JfSUQiLCJBTV9OQVpXSVNLTyIsIkFNX0lNSUUiLCJaQV9UWVRVTCIsIlpBX1RZVFVMX09SWUdJTkFMVSIsIlpBX0pFWllLX09SWUdJTkFMVSIsIk9TX09TT0JBX0lEIiwiT1NfTkFaV0lTS08iLCJPU19JTUlFIiwiZm9fc3ltYm9sIiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCJ3eWRhbmllIiwiemFfdG9teSIsImluc3R5dHVjamEiLCJXWV9XWURBV05JQ1RXT19JRCIsIldZX01JQVNUTyIsIldZX05BWldBIiwiemFfcm9rX3d5ZGFuaWEiLCJ6YV9vcGlzX2tzIiwic2VyaWEiLCJUV19OQVpXSVNLTyIsIlRXX0lNSUUiLCJyZWRha3Rvcl9kemlhbHUiLCJaQV9BRE5PVEFDSkUiLCJCTl9VUkwiKQ0KcG9sYWN6b25lIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLHBvbGFfcGJsLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3R5dHVsLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3R5dHVsX29yeWdpbmFsdSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9qZXp5a19vcnlnaW5hbHUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfb3Bpc193c3BvbHR3b3Jjb3csYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfd3lkYW5pZSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9pbnN0eXR1Y2phLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX29waXNfa3MsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfc2VyaWFfd3lkYXduaWN6YSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90b215LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2Fkbm90YWNqZSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9VUkwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgc2VsZWN0KG5vcXVvdGUoa29sZWpub3NjKSkNCmNvbG5hbWVzKHBvbGFjem9uZSkgPC0gYygicmVrb3JkX0JOIiwicnpfbmF6d2EiLCJ6YV9yb19yb2siLCJ6YV90eXBlIiwicnpfcm9kemFqX2lkIiwiRFpfTkFaV0EiLCJEWl9EWklBTF9JRCIsInR3X3R3b3JjYV9pZCIsImFtX2F1dG9yX2lkIiwiYW1fbmF6d2lza28iLCJhbV9pbWllIiwiemFfdHl0dWwiLCJ6YV90eXR1bF9vcnlnaW5hbHUiLCJ6YV9qZXp5a19vcnlnaW5hbHUiLCJvc19vc29iYV9pZCIsIm9zX25hendpc2tvIiwib3NfaW1pZSIsImZvX3N5bWJvbCIsInphX29waXNfd3Nwb2x0d29yY293IiwiemFfd3lkYW5pZSIsInphX3RvbXkiLCJ6YV9pbnN0eXR1Y2phIiwid3lfd3lkYXduaWN0d29faWQiLCJ3eV9taWVqc2NlIiwid3lfbmF6d2EiLCJ6YV9yb2tfd3lkYW5pYSIsInphX29waXNfZml6eWN6bnlfa3NpYXpraSIsInphX3NlcmlhX3d5ZGF3bmljemEiLCJ0d19uYXp3aXNrbyIsInR3X2ltaWUiLCJwcmFjb3duaWsiLCJ6YV9hZG5vdGFjamUiLCJCTl9VUkwiKQ0KDQojemFzeWduYWxpem93YW5pZSBuaWVwb3ByYXduZWdvIGtvZG93YW5pYQ0KeCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiPFVcXCsoLi4uLik+Iixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpIT0wLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBCxYLEhWQga29kb3dhbmlhIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIFpuYWpkxbogZnJhesSZIFwiPz8/XCIgaSB6cmVkYWd1aiBwb2xlIixzZXAgPSAiIiksc2VwID0gIiMgIikscGFzdGUoIlVXQUdBISBCxYLEhWQga29kb3dhbmlhIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIFpuYWpkxbogZnJhesSZIFwiPz8/XCIgaSB6cmVkYWd1aiBwb2xlIixzZXAgPSAiIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCiAgcG9sYWN6b25lWyxpXSA8LSBnc3ViKCI8VVxcKyguLi4uKT4iLCAiPz8/IiwgcG9sYWN6b25lWyxpXSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgem5ha3UgJCB3IGt0w7NyeW3FmyB6IHDDs2wNClggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIlxcJCIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIHpuYWsgXCIkXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gem5hayBcIiRcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIGZyYXp5ICJjaGFyYWN0ZXIoMCkiIHcga3TDs3J5bcWbIHogcMOzbA0KWCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiY2hhcmFjdGVyXFwoMFxcKSIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIGZyYXrEmSBcImNoYXJhY3RlcigwKVwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIikscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIGZyYXrEmSBcImNoYXJhY3RlcigwKVwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgem5ha3UgIyB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3DQpwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiXFwjIixwb2xhY3pvbmUkemFfb3Bpc193c3BvbHR3b3Jjb3cpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAsIlVXQUdBISBaZSB3emdsxJlkdSBuYSBrb25mbGlrdCB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3IHd5Ymllcnogd8WCYcWbY2l3xIUgd2FydG/Fm8SHIChzdHJlZmEgb2Rwb3dpZWR6aWFsbm/Fm2NpIFwiI1wiIHdzcMOzxYJ0d8OzcmN5IHogcG9sYSA3MDApIixwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEga29uZmxpa3QgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8OzdyB3eWJpZXJ6IHfFgmHFm2Npd8SFIHdhcnRvxZvEhyAoc3RyZWZhIG9kcG93aWVkemlhbG5vxZtjaSAjIHdzcMOzxYJ0d8OzcmN5IHogcG9sYSA3MDApIixzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KI2tvcmVrdGEgYXV0b21hdHljem5lZ28gSU9LDQphdXRvbWF0eWN6bnlfSU9LIDwtIHBvbGFjem9uZSAlPiUNCiAgbXV0YXRlKGN6eV90eXRfb3J5ZyA9ICghZ3JlcGwoInBvbHNrIixEWl9OQVpXQSkmIWlzLm5hKHphX3R5dHVsX29yeWdpbmFsdSkpfGdyZXBsKCJwb2xzayIsRFpfTkFaV0EpKSAlPiUNCiAgZmlsdGVyKHphX2Fkbm90YWNqZT09IiImYW1fbmF6d2lza28hPSJOQSImIWdyZXBsKCJwc2V1ZHxuYXp3Iix6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpJiFncmVwbCgiXFx8IixhbV9uYXp3aXNrbykmY3p5X3R5dF9vcnlnPT1UUlVFKSAlPiUNCiAgc2VsZWN0KHJla29yZF9CTikgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBmaWx0ZXIocmVrb3JkX0JOICVub3RpbiUgZGF0YSRaQV9VV0FHSVtkYXRhJGN6eV9hdXRvbWF0eWN6bmllPT0ibmllIl0pICU+JQ0KICBtdXRhdGUoYXV0b21hdHljem55X2ltcG9ydCA9ICJ0YWsiKQ0KDQp3cml0ZS5jc3YyKGF1dG9tYXR5Y3pueV9JT0ssICJDOi9Vc2Vycy9DZXphcnkvRGVza3RvcC9pbXBfMjAwOV9hdXRvbWF0eWN6bmVfcHJ6ZWRtaW90b3dlLmNzdiIsIHJvdy5uYW1lcyA9IEYsIG5hID0gJycsIGZpbGVFbmNvZGluZyA9ICdVVEYtOCcpDQoNCm91dCA8LSBjU3BsaXQocG9sYWN6b25lLCBjKCJhbV9hdXRvcl9pZCIsICJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgImZvX3N5bWJvbCIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiksc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIHVuaXF1ZSgpDQoNCm91dCRyZWtvcmRfQk4gPC0gaWZlbHNlKGlzLm5hKG91dCRyZWtvcmRfQk4pLCcnLGFzLmNoYXJhY3RlcihvdXQkcmVrb3JkX0JOKSkNCm91dCRyel9uYXp3YSA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X25hendhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJ6X25hendhKSkNCm91dCR6YV9yb19yb2sgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9yb19yb2spLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9fcm9rKSkNCm91dCR6YV90eXBlIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHlwZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXBlKSkNCm91dCRyel9yb2R6YWpfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRyel9yb2R6YWpfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfcm9kemFqX2lkKSkNCm91dCREWl9OQVpXQSA8LSBpZmVsc2UoaXMubmEob3V0JERaX05BWldBKSwnJyxhcy5jaGFyYWN0ZXIob3V0JERaX05BWldBKSkNCm91dCREWl9EWklBTF9JRCA8LSBpZmVsc2UoaXMubmEob3V0JERaX0RaSUFMX0lEKSwnJyxhcy5jaGFyYWN0ZXIob3V0JERaX0RaSUFMX0lEKSkNCm91dCR0d190d29yY2FfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCR0d190d29yY2FfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfdHdvcmNhX2lkKSkNCm91dCRhbV9hdXRvcl9pZCA8LSBpZmVsc2UoaXMubmEob3V0JGFtX2F1dG9yX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2F1dG9yX2lkKSkNCm91dCRhbV9uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JGFtX25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX25hendpc2tvKSkNCm91dCRhbV9pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkYW1faW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9pbWllKSkNCm91dCR6YV90eXR1bCA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5dHVsKSkNCm91dCR6YV90eXR1bF9vcnlnaW5hbHUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWxfb3J5Z2luYWx1KSkNCm91dCR6YV9qZXp5a19vcnlnaW5hbHUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfamV6eWtfb3J5Z2luYWx1KSkNCm91dCRvc19vc29iYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JG9zX29zb2JhX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX29zb2JhX2lkKSkNCm91dCRvc19uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JG9zX25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX25hendpc2tvKSkNCm91dCRvc19pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfaW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCRvc19pbWllKSkNCm91dCRmb19zeW1ib2wgPC0gaWZlbHNlKGlzLm5hKG91dCRmb19zeW1ib2wpLCcnLGFzLmNoYXJhY3RlcihvdXQkZm9fc3ltYm9sKSkNCm91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfd3Nwb2x0d29yY293KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX29waXNfd3Nwb2x0d29yY293KSkNCm91dCR6YV93eWRhbmllIDwtIGlmZWxzZShpcy5uYShvdXQkemFfd3lkYW5pZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV93eWRhbmllKSkNCm91dCR6YV90b215IDwtIGlmZWxzZShpcy5uYShvdXQkemFfdG9teSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90b215KSkNCm91dCR6YV9pbnN0eXR1Y2phIDwtIGlmZWxzZShpcy5uYShvdXQkemFfaW5zdHl0dWNqYSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9pbnN0eXR1Y2phKSkNCm91dCR3eV93eWRhd25pY3R3b19pZCA8LSBpZmVsc2UoaXMubmEob3V0JHd5X3d5ZGF3bmljdHdvX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X3d5ZGF3bmljdHdvX2lkKSkNCm91dCR3eV9taWVqc2NlIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbWllanNjZSksJycsYXMuY2hhcmFjdGVyKG91dCR3eV9taWVqc2NlKSkNCm91dCR3eV9uYXp3YSA8LSBpZmVsc2UoaXMubmEob3V0JHd5X25hendhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X25hendhKSkNCm91dCR6YV9yb2tfd3lkYW5pYSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3Jva193eWRhbmlhKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3Jva193eWRhbmlhKSkNCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSkNCm91dCR6YV9zZXJpYV93eWRhd25pY3phIDwtIGlmZWxzZShpcy5uYShvdXQkemFfc2VyaWFfd3lkYXduaWN6YSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSkNCm91dCR0d19uYXp3aXNrbyA8LSBpZmVsc2UoaXMubmEob3V0JHR3X25hendpc2tvKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X25hendpc2tvKSkNCm91dCR0d19pbWllIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfaW1pZSksJycsYXMuY2hhcmFjdGVyKG91dCR0d19pbWllKSkNCm91dCRwcmFjb3duaWsgPC0gaWZlbHNlKGlzLm5hKG91dCRwcmFjb3duaWspLCcnLGFzLmNoYXJhY3RlcihvdXQkcHJhY293bmlrKSkNCm91dCR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9hZG5vdGFjamUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfYWRub3RhY2plKSkNCm91dCRCTl9VUkwgPC0gaWZlbHNlKGlzLm5hKG91dCRCTl9VUkwpLCcnLGFzLmNoYXJhY3RlcihvdXQkQk5fVVJMKSkNCg0Kb3V0ICUkJSAgDQogICAgeyByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCkgJiBCTl9VUkw9PWxhZyhCTl9VUkwsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQpvdXQkc2FtZVsxXSA8LSAwDQpvdXQkZHppZWxvbmUgPC0gcGFzdGUob3V0JGFtX2F1dG9yX2lkLG91dCRhbV9uYXp3aXNrbyxvdXQkYW1faW1pZSxvdXQkb3Nfb3NvYmFfaWQsb3V0JG9zX25hendpc2tvLG91dCRvc19pbWllLG91dCRmb19zeW1ib2wsb3V0JHd5X3d5ZGF3bmljdHdvX2lkLG91dCR3eV9taWVqc2NlLG91dCR3eV9uYXp3YSxzZXAgPSAiIikNCg0Kb3V0IDwtIG91dCAlPiUNCiAgZmlsdGVyKCEoc2FtZT09MSZkemllbG9uZT09IiIpKSAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCm91dCAlJCUgIA0KICAgIHsgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpICYgQk5fVVJMPT1sYWcoQk5fVVJMLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBvdXQkc2FtZQ0KDQojdWNpxJljaWUgemJ5dCBkxYJ1Z2ljaCBjacSFZ8OzdyB6bmFrw7N3LCBieSB3ZXN6xYJ5IGRvIG9yYWNsZSdhDQpkbHVnb3NjaSA8LSBkYXRhLmZyYW1lKHBvbGUgPSBjKCJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwgInphX3R5dHVsIiwgInphX3R5dHVsX29yeWdpbmFsdSIsICJ6YV9qZXp5a19vcnlnaW5hbHUiLCAib3NfbmF6d2lza28iLCAib3NfaW1pZSIsICJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsICJ6YV9pbnN0eXR1Y2phIiwgInd5X21pZWpzY2UiLCAid3lfbmF6d2EiLCAiemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIiwgInphX3NlcmlhX3d5ZGF3bmljemEiLCAidHdfbmF6d2lza28iLCAidHdfaW1pZSIsICJ6YV9hZG5vdGFjamUiKSwgbGljemJhX3puYWtvdyA9IGMoNTAsNDAsNTAwLDUwMCwxMDAsNTAsNDAsNTAwLDI1NSw0MCwyNTUsMTAwMCwyNTUsMjAwLDQwLDIwMDApKQ0KeCA8LSBtYXRjaChkbHVnb3NjaSRwb2xlLG5hbWVzKG91dCkpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGRsdWdvc2MgPC0gZGx1Z29zY2kkbGljemJhX3puYWtvd1ttYXRjaChuYW1lcyhvdXRbaV0pLGRsdWdvc2NpJHBvbGUpXQ0KICBvdXQkemFfYWRub3RhY2plIDwtIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSkmb3V0JHphX2Fkbm90YWNqZSE9IiIscGFzdGUob3V0JHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFBvbGUgIixhcy5jaGFyYWN0ZXIobmFtZXMob3V0W2ldKSksIiBiecWCbyB6Ynl0IGTFgnVnaWUgaSB6b3N0YcWCbyBwcnp5Y2nEmXRlLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSkmb3V0JHphX2Fkbm90YWNqZT09IiIscGFzdGUoIlVXQUdBISBQb2xlICIsYXMuY2hhcmFjdGVyKG5hbWVzKG91dFtpXSkpLCIgYnnFgm8gemJ5dCBkxYJ1Z2llIGkgem9zdGHFgm8gcHJ6eWNpxJl0ZS4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihvdXQkemFfYWRub3RhY2plKSkpDQogIA0KICBvdXRbLGldIDwtIGlmZWxzZShkbHVnb3NjPG5jaGFyKGFzLmNoYXJhY3RlcihvdXRbLGldKSksYXMuY2hhcmFjdGVyKHN1YnN0cihvdXRbLGldLDEsZGx1Z29zYykpLGFzLmNoYXJhY3RlcihvdXRbLGldKSkNCn0NCg0Kb3V0JHJla29yZF9CTltvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X25hendhW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9fcm9rW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHlwZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X3JvZHphal9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JERaX05BWldBW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfRFpJQUxfSURbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d190d29yY2FfaWRbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXR1bFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2plenlrX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfd3lkYW5pZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3RvbXlbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9pbnN0eXR1Y2phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9rX3d5ZGFuaWFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2lbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9zZXJpYV93eWRhd25pY3phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfbmF6d2lza29bb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19pbWllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcHJhY293bmlrW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfYWRub3RhY2plW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkQk5fVVJMW291dCRzYW1lID09IDFdIDwtICIiDQoNCiNwcnp5cGlzYW5pZSBkbyBhdXRvbWF0eWN6bmVnbyBPSyByZWRha3RvcmEgImF1dG9tYXQiDQpvdXQgPC0gb3V0ICU+JQ0KICBtdXRhdGUocHJhY293bmlrID0gaWZlbHNlKHJla29yZF9CTiAlaW4lIGF1dG9tYXR5Y3pueV9JT0skcmVrb3JkX0JOLCJBVVRPTUFUIixhcy5jaGFyYWN0ZXIocHJhY293bmlrKSkpICU+JQ0KICBzZWxlY3QoMTozMykNCg0KI3DEmXRsYSB6YXBpc3VqxIVjYSBwbyBvay4gMjAwMCB3aWVyc3p5IHogdXd6Z2zEmWRuaWVuaWVtIGtvbXBsZXRub8WbY2kgcmVrb3Jkw7N3IGJpYmxpb2dyYWZpY3pueWNoIHJvenBpc2FueWNoIG5hIGtpbGthIHdpZXJzenkNCm91dCA8LSBvdXQgJT4lDQogIG11dGF0ZShwb2R6aWFsID0gaWZlbHNlKHJla29yZF9CTiE9IiIsYXMuY2hhcmFjdGVyKHJla29yZF9CTiksTkEpKSAlPiUNCiAgZmlsbChwb2R6aWFsKQ0KaWxlIDwtIHVuaXF1ZShvdXQkcG9kemlhbCkNCmlsZSA8LSBzcGxpdCh1bmlxdWUoaWxlKSwgY2VpbGluZyhzZXFfYWxvbmcodW5pcXVlKGlsZSkpLzE1MDApKQ0KDQp4IDwtIDE6bGVuZ3RoKGlsZSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZmluYWwgPC0gb3V0ICU+JQ0KICAgIGZpbHRlcihwb2R6aWFsICVpbiUgaWxlW1tpXV0pICU+JQ0KICAgIHNlbGVjdCgtcG9kemlhbCkNCiAgd3JpdGUueGxzeChmaW5hbCwgcGFzdGUoIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMDlfcHJ6ZWRtaW90b3dhX2RvX2ltcG9ydHUiLGksIi54bHN4IixzZXAgPSAiIiksc2hlZXROYW1lID0gImdvdG93ZSIpDQp9DQpgYGANCg0KYGBge3Iga3NpxIXFvGtpIGFudG9sb2dpZX0NCmRhdGEgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09ImFudG9sb2dpYSIpICU+JQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gcGFzdGUocmVkYWt0b3JfZHppYWx1LCJfYW50IixzZXAgPSAiIikpDQojdXdvbG5pZW5pZSBrb2x1bW4geiBkYW55bWkgeiBibiBpIHByemV0d29yemVuaWUgZG8gUEJMDQojMTogemFfdXdhZ2ksIHJ6X25hendhLCB6YV9yb19yb2ssIHphX3R5cGUsIHJ6X3JvZHphal9pZCwgdHdfdHdvcmNhX2lkLCB0d19uYXp3aXNrbywgdHdfaW1pZSwgZHpfZHppYWxfaWQsIGR6X25hendhLCByZWRha3Rvcl9kemlhbHUNCnBvbGFfcGJsIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgUlpfTkFaV0EsIFpBX1JPX1JPSyA9IHJvaywgUlpfUk9EWkFKX0lELCBUV19UV09SQ0FfSUQsIFRXX05BWldJU0tPLCBUV19JTUlFLCBEWl9EWklBTF9JRCwgRFpfTkFaV0EsIHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShaQV9UWVBFID0gIktTIikNCiMyOiBhdXRvcg0KQk5fYXV0b3IgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKEFNX0FVVE9SX0lEID0gTkEsDQogICAgICAgICBBTV9OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgQU1fSU1JRSA9IE5BKQ0KDQojYWRub3RhY2plIHogYXV0b3LDs3cNCiN3IGFudG9sb2dpaSBhZG5vdGFjamEgbXVzaSBiecSHIHdjemXFm25pZWosIMW8ZWJ5IG5hIGfDs3J6ZSBiecWCbyBpbmZvIG8gdGVrc3RhY2ggYXV0b3LDs3cNCg0KWkFfQUROT1RBQ0pFIDwtIGRhdGEgJT4lDQogIHNlbGVjdChYMTAwLFgyNDUsWkFfVVdBR0kpDQojcG9sZSAxMDANCm1hcmNfZmllbGRfMTAwIDwtIFpBX0FETk9UQUNKRSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoWkFfQUROT1RBQ0pFJFgxMDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8xMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMTAwPC1jYmluZChtYXJjX2ZpZWxkXzEwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzEwMCRYMTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMTAwJFgxMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMTAwJFgxMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzEwMCRYMTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCiN0dXRhaiBtb8W8ZSBiecSHIGLFgsSFZCB6ZSB3emdsxJlkdSBuYSBicmFrIGtvbHVtbnkgJGIsIHd0ZWR5IG5hbGXFvHkgem1pZW5pxIcgbGluacSZIHogc2VsZWN0ZW0gaSB6YWtvbWVudG93YcSHIGxpbmnEmTogbXV0YXRlKGAkYWAgPSBpZmVsc2UoIWlzLm5hKGAkYmApLHBhc3RlKGAkYWAsYCRiYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JQ0KWkFfQUROT1RBQ0pFIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICAjc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogICNtdXRhdGUoYCRhYCA9IGlmZWxzZSghaXMubmEoYCRiYCkscGFzdGUoYCRhYCxgJGJgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShBTV9OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSwNCiAgICAgICAgIEFNX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIioiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSkgJT4lDQogIHVuaXRlKCJaQV9BRE5PVEFDSkUiLCBBTV9JTUlFOkFNX05BWldJU0tPLCBzZXAgPSAiICIpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBwYXN0ZSgiW1Rla3N0eSBhdXQuOl0iLHBhc3RlKFpBX0FETk9UQUNKRSxjb2xsYXBzZSA9ICIsICIpLHNlcCA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMzogdHl0dcWCDQojcG9sZSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKFpBX1RZVFVMID0gcGFzdGUoYCRhYCxgJGJgLGAkbmAsYCRwYCxzZXAgPSAiIikpDQoNCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBtdXRhdGUoWkFfVFlUVUwgPSBwYXN0ZShgJGFgLGAkYmAsYCRuYCxgJHBgLHNlcCA9ICIgIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZW1vdmUoWkFfVFlUVUwsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMKQ0KI2RvcGlzYW5pZSBnYXR1bmt1IGRvIHByemVkbWlvdG93ZWogbmEgcG9kc3Rhd2llIDY1NSBpIDY1MCAgDQpnYXR1bmtpX3BibCA8LSBkYXRhLmZyYW1lKGdhdHVuZWsgPSBjKCJhZm9yeXptIiwgImFsYnVtIiwgImFudG9sb2dpYSIsICJhdXRvYmlvZ3JhZmlhIiwgImR6aWVubmlrIiwgImVzZWoiLCAiZmVsaWV0b24iLCAiaW5uZSIsICJrYXphbmllIiwgImxpc3QiLCAibWluaWF0dXJhIHByb3rEhSIsICJvcG93aWFkYW5pZSIsICJwb2VtYXQiLCAicG93aWXFm8SHIiwgInByb3phIiwgInByb3phIHBvZXR5Y2thIiwgInJlcG9ydGHFvCIsICJyb3ptecWbbGFuaWUgcmVsaWdpam5lIiwgInJ5c3VuZWssIG9icmF6IiwgInNjZW5hcml1c3oiLCAic3praWMiLCAidGVrc3QgYmlibGlqbnkiLCAidGVrc3QgZHJhbWF0eWN6bnkiLCAiZHJhbWF0IiwgIndpZXJzeiIsICJ3c3BvbW5pZW5pYSIsICJ3eXBvd2llZMW6IiwgInBhbWnEmXRuaWtpIiwgInBvZXpqYSIsICJsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLCAic2F0eXJhIiwgInBpb3NlbmthIikpDQoNCiNkcmFtYXQsIHBhbWnEmXRuaWtpLCBwb2V6amEsIGxpdGVyYXR1cmEgcG9kcsOzxbxuaWN6YSwgc2F0eXJhLCBwaW9zZW5rYQ0KZ2F0dW5raV9ibiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1NSxYNjUwKQ0KDQpnYXR1bmtpX2JuIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICBmcm9tIGdhdHVua2lfYm4NCiAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIGdhdHVua2lfcGJsIG9uIGxvd2VyKGdhdHVua2lfYm4uWDY1NSkgbGlrZSAnJSd8fGdhdHVua2lfcGJsLmdhdHVuZWt8fCclJyIpDQpnYXR1bmtpX2JuIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgIGZyb20gZ2F0dW5raV9ibg0KICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBnYXR1bmtpX3BibCBvbiBsb3dlcihnYXR1bmtpX2JuLlg2NTApIGxpa2UgJyUnfHxnYXR1bmtpX3BibC5nYXR1bmVrfHwnJSciKQ0KY29sbmFtZXMoZ2F0dW5raV9ibilbNV0gPC0gImdhdHVuZWsyIg0KZ2F0dW5raV9ibiA8LSBnYXR1bmtpX2JuICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGlmZWxzZShpcy5uYShnYXR1bmVrKSYhaXMubmEoZ2F0dW5lazIpLGFzLmNoYXJhY3RlcihnYXR1bmVrMiksYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkgJT4lDQogIGZpbHRlcighaXMubmEoZ2F0dW5laykpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksZ2F0dW5laykgJT4lDQogIG11dGF0ZShnYXR1bmVrID0gaWZlbHNlKGdhdHVuZWs9PSJkcmFtYXQiLCJ0ZWtzdCBkcmFtYXR5Y3pueSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0icGFtacSZdG5pa2kiLCJ3c3BvbW5pZW5pYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBvZXpqYSIsIndpZXJzeiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLCJyZXBvcnRhxbwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBpb3NlbmthIiwid2llcnN6Iixhcy5jaGFyYWN0ZXIoZ2F0dW5laykpKSkpKSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBwYXN0ZShnYXR1bmVrLGNvbGxhcHNlID0gIiwgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGdzdWIoIiheLikiLCJcXFVcXDEiLHBlcmwgPSBUUlVFLCBnYXR1bmVrKSkNCiNwb8WCxIVjemVuaWUgdHl0dcWCdSB6IGdhdHVua2llbQ0KemFfdHl0dWwgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIGxlZnRfam9pbiguLGdhdHVua2lfYm4sYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9UWVRVTCA9IGlmZWxzZSghaXMubmEoZ2F0dW5laykmc3Vic3RyKFpBX1RZVFVMLG5jaGFyKFpBX1RZVFVMKSxuY2hhcihaQV9UWVRVTCkpPT0iLiIscGFzdGUoWkFfVFlUVUwsIiBbIixnYXR1bmVrLCJdIixzZXAgPSAiIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGdhdHVuZWspJnN1YnN0cihaQV9UWVRVTCxuY2hhcihaQV9UWVRVTCksbmNoYXIoWkFfVFlUVUwpKSE9Ii4iLHBhc3RlKFpBX1RZVFVMLCIuIFsiLGdhdHVuZWssIl0iLHNlcCA9ICIiKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfVFlUVUwpDQojNDogdHl0dcWCIG9yeWdpbmHFgnUNCiNwb2xlIDI0Ng0KbWFyY19maWVsZF8yNDYgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDYpJT4lDQogIGZpbHRlcihYMjQ2IT0iIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIn4iKSwNCiAgICAgICAgIFgyNDY9c3RyX3JlcGxhY2VfYWxsKFgyNDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ2IT0iIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ2PC1jYmluZChtYXJjX2ZpZWxkXzI0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NiRYMjQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ2JFgyNDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ2JFgyNDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NiRYMjQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2ICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWciLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIiKSwNCiAgICAgICAgIGAkcGAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRwYCksIiIsYXMuY2hhcmFjdGVyKGAkcGApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShYMjQ2ID0gcGFzdGUoYCRhYCxgJGJgLGAkbmAsYCRwYCxzZXAgPSAiIikpICU+JQ0KICBtdXRhdGUoWDI0NiA9IHN0cl9yZW1vdmUoWDI0NiwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCg0KI3BvbGUgNTAwDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwifiIpLA0KICAgICAgICAgWDUwMD1zdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDUwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzUwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81MDA8LWNiaW5kKG1hcmNfZmllbGRfNTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTAwJFg1MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81MDAkWDUwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81MDAkWDUwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTAwJFg1MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTAwIDwtIG1hcmNfZmllbGRfNTAwICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWdcXC5cXDoiLFg1MDApKSAlPiUNCiAgbXV0YXRlKFg1MDAgPSBzdHJfcmVtb3ZlKGAkYWAsIl5UeXRcXC4gb3J5Z1xcLjogfF5UeXRcXCwgb3J5Z1xcLjogfF4uKj90eXRcXC4gb3J5Z1xcLjogIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYNTAwID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApKSkpKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsICJcXC4kIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCIoLHswLDF9IHswLDF9KVxcZHs0fS4qJHwoLCB0fC4gVCl5dC4gb3J5Zy4gY3lrbHU6IikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCkNCiN0eXR1xYIgb3J5Z2luYcWCdQ0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ2LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzUwMCxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFg1MDAgPSBpZmVsc2UoaXMubmEoWDUwMCksTkEsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgib3J5ZyIsWDUwMCksTkEsYXMuY2hhcmFjdGVyKFg1MDApKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiXFwuIC0gIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gLSAuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJOYSBrc2nEhcW8Y2UgcHNldWQiLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiBOYSBrc2nEhcW8Y2UgcHNldWQuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJQcnpla8WCXFwuIHdnIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gUHJ6ZWvFglxcLiB3Zy4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWkFfVFlUVUxfT1JZR0lOQUxVID0gaWZlbHNlKGlzLm5hKFgyNDYpJmlzLm5hKFg1MDApLE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApLGFzLmNoYXJhY3RlcihYMjQ2KSkpLA0KICAgICAgICAgWkFfVFlUVUxfT1JZR0lOQUxVID0gc3RyX3JlbW92ZV9hbGwoWkFfVFlUVUxfT1JZR0lOQUxVLCdcXCInKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTF9PUllHSU5BTFUpDQoNCiM1OiBqxJl6eWsgb3J5Z2luYcWCdQ0KbWFyY19maWVsZF8wNDEgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgwNDEpJT4lDQogIGZpbHRlcihYMDQxIT0iIikgJT4lDQogIG11dGF0ZShYMDQxPXN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgwNDEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVtb3ZlX2FsbChYMDQxLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgwNDEsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMDQxLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDQxKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzA0MTwtY2JpbmQobWFyY19maWVsZF8wNDEsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wNDEkWDA0MSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzA0MSRYMDQxLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzA0MVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzA0MSRYMDQxKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wNDEkWDA0MSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfamV6eWtfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMDQxICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfSkVaWUtfT1JZR0lOQUxVID0gYCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9KRVpZS19PUllHSU5BTFUgPSBzdHJfcmVwbGFjZV9hbGwoWkFfSkVaWUtfT1JZR0lOQUxVLCJcXCRhIiwiLCIpKSAlPiUNCiAgdW5pcXVlKCkNCg0KIzY6IHdzcMOzxYJ0d8OzcmN5DQptYXJjX2ZpZWxkXzcwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIiguLlxcJGEpIiwifFxcMSIpLA0KICAgICAgICAgWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvc29iYSA9IGAkYWAsZnVua2NqYSA9IGAkZWApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGZ1bmtjamEpKSAlPiUNCiAgbXV0YXRlKG9zb2JhID0gc3RyX3JlbW92ZShvc29iYSwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSwNCiAgICAgICAgIE9TX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKG9zb2JhKSksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSwNCiAgICAgICAgIHdzX3Byb3N0eSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIob3NvYmEpLCAiXFxXIiwgIiIpLA0KICAgICAgICAgZnVfcHJvc3RhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihmdW5rY2phKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF93c3BvbHR3b3JjeSAlPiUgc2VsZWN0KE9TX09TT0JBX0lELE9TX0xJQ1pCQV9aQVBJU09XLG5hendhX3Byb3N0YSksYnk9Yygid3NfcHJvc3R5Ij0ibmF6d2FfcHJvc3RhIikpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsLU9TX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhWzE6Ml0pKQ0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2FbIWR1cGxpY2F0ZWQoQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkpLF0gJT4lDQogIGxlZnRfam9pbiguLFBCTF9mdW5rY2plLGJ5PWMoImZ1X3Byb3N0YSI9Im5hendhIikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLE5BLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojdHV0YWogcHJ6ZXN6dWthxIcgWDI0NSBpIHpuYWxlxbrEhyBixYLEmWR5IHdzcMOzxYJ0d8OzcmPDs3cNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoQk5fd3Nwb2x0d29yY2FbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBCTl93c3BvbHR3b3JjYSRjenlfbmF6d2lza29baV0gPC0gc3RyX2RldGVjdChCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSxCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggNzAwIGkgMjQ1LiBQb3LDs3duYWogcG9sYSB3c3DDs8WCdMOzcmPDs3cgdyBmb3JtdWxhcnp1IHogcG9sZW0gQk46ICIsWDI0NWMsc2VwID0gIiIpLE5BKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phLFpBX0FETk9UQUNKRSkNCg0KIzc6IG9waXMgd3Nww7PFgnR3w7NyY8Ozdw0Kb3Bpc193c3BvbHR3b3Jjb3cgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxmdW5rY2phLE9TX0lNSUUsT1NfTkFaV0lTS08pICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShPU19OQVpXSVNLTyl8KGlzLm5hKE9TX05BWldJU0tPKSZncmVwbCgiZXQgYWxcXC4iLFgyNDVjKSkpICU+JQ0KICBtdXRhdGUoamVzdF9ldF9hbCA9IGdyZXBsKCJldCBhbFxcLiIsWDI0NWMpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShPU19JTUlFPT0iKiIsIiIsYXMuY2hhcmFjdGVyKE9TX0lNSUUpKSwNCiAgICAgICAgIG9waXMgPSBpZmVsc2UoIWlzLm5hKE9TX05BWldJU0tPKSxwYXN0ZShmdW5rY2phLE9TX0lNSUUsIE9TX05BWldJU0tPLCBzZXAgPSAiICIpLCIiKSwNCiAgICAgICAgIG9waXMgPSBzdHJfcmVwbGFjZV9hbGwob3BpcywiICsiLCIgIiksDQogICAgICAgICBvcGlzID0gaWZlbHNlKG9waXM9PSIgIiwiIixhcy5jaGFyYWN0ZXIob3BpcykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsamVzdF9ldF9hbCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBwYXN0ZShvcGlzLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBqZXN0X2V0X2FsID0gcGFzdGUodW5pcXVlKGplc3RfZXRfYWwpLHNlcCA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShvcGlzID0gaWZlbHNlKGplc3RfZXRfYWw9PVRSVUUmb3Bpcz09IiIsImV0IGFsLiIsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShqZXN0X2V0X2FsLHBhc3RlKG9waXMsImV0IGFsLiIsc2VwID0gIiAiKSxvcGlzKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcykNCg0KIzcwMA0KbWFyY19maWVsZF83MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoLi5cXCRhKSIsInxcXDEiKSwNCiAgICAgICAgIFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgZnVua2NqYV9kdXphID0gc3RyX3RvX2xvd2VyKGZ1bmtjamEpLA0KICAgICAgICAgb3BpcyA9IHBhc3RlKGZ1bmtjamFfZHV6YSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpLA0KICAgICAgICAgb3Bpc19kdXp5ID0gcGFzdGUoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsb3Bpc19kdXp5KSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUob3BpcyA9IHBhc3RlKG9waXMsY29sbGFwc2UgPSAiLiAiKSwNCiAgICAgICAgIG9waXNfZHV6eSA9IHBhc3RlKG9waXNfZHV6eSxjb2xsYXBzZSA9ICIuICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQojb3BpcyB3c3DDs8WCdHfDs3Jjw7N3IHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRjYCkNCg0KI3BvcsOzd25hbmllIG9waXN1IHdzcMOzxYJ0d8OzcmPDs3cgeiAyNDUgaSA3MDANCndzcG9sdHdvcmN5IDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgY1NwbGl0KC4sIiRjIixzZXAgPSAiIDsgIixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICAjb2dyYW5pY3phbmllIG9zw7NiIHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kNCiAgbXV0YXRlKGN6eV9tYWxhID0gZ3JlcGwoIiBbYS16xJnDs8SFxZvFgsW8xbrEh8WEXXxeW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XFxbW2EtesSZw7PEhcWbxYLFvMW6xIfFhF0iLGAkY2AsaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQ0KICBmaWx0ZXIoY3p5X21hbGE9PVRSVUUpICU+JQ0KICBzZWxlY3QoLWN6eV9tYWxhKSAlPiUNCiAgI211dGF0ZShgJGNgID0gZ3N1YigiXihcXFspezAsMX0oW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIsIlxcMVxcVVxcMiIscGVybCA9IFRSVUUsYCRjYCkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShYMjQ1ID0gcGFzdGUoYCRjYCwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogIHNlbGVjdCgtYCRjYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUob3JkZXJfcGJsID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChvcGlzLCIoPzw9XnwgfFxcW3wtKShbQS1aQcOBw4DDgsODw4TEgsSAw4XEhMOGRcOJw4jDisOLxJrEksSWxJhJw43DjMOOw4/EqsSuSU/Dk8OSw5TDlcOWxZDDmMWSVcOaw5nDm8OcxbDFqsWvWcOdQ8SGxIzDp0TEjsSQxJBHxKLEnkvEtkzFgcS7TsWDw5HFh8WFxYpSxZhTxZrFoMWeU8OfVMWkxabDnsWiOFrFu8W5xb1hLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiKSksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfcGJsLCIoLio/XCIpKC4pKFwiLio/LikiLCAiXFwyIiksDQogICAgICAgICBvcmRlcl9ibiA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoWDI0NSwiKD88PV58IHxcXFt8LSkoW0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9YS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIikpLA0KICAgICAgICAgb3JkZXJfYm4gPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfYm4sIiguKj9cIikoLikoXCIuKj8uKSIsICJcXDIiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxdIiksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVtb3ZlX2FsbChvcmRlcl9wYmwsICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIG9yZGVyX2JuID0gc3RyX3JlbW92ZV9hbGwob3JkZXJfYm4sICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIHRvX3NhbW8gPSBvcmRlcl9wYmw9PW9yZGVyX2JuLA0KICAgICAgICAgWDI0NSA9IGdzdWIoIiheW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSguKikiLCJcXFVcXDFcXEVcXDIiLHBlcmwgPSBUUlVFLCBYMjQ1KSkgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKGN6eV9wbCA9IGdyZXBsKCJwb2wiLFpBX0pFWllLX09SWUdJTkFMVSl8aXMubmEoWkFfSkVaWUtfT1JZR0lOQUxVKSwNCiAgICAgICAgIGRlY3l6amEgPSBpZmVsc2UodG9fc2Ftbz09RkFMU0V8Y3p5X3BsPT1GQUxTRSxGQUxTRSxUUlVFKSkNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gd3Nwb2x0d29yY3kgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IGlmZWxzZShkZWN5emphPT1UUlVFLGFzLmNoYXJhY3RlcihYMjQ1KSxwYXN0ZShYMjQ1LG9waXNfZHV6eSxzZXAgPSAiIyIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzX2R1enksemFfb3Bpc193c3BvbHR3b3Jjb3cpICU+JQ0KICBjU3BsaXQoLiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLHNlcCA9ICIjIixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3dfMiA9IGlmZWxzZShpcy5uYSh6YV9vcGlzX3dzcG9sdHdvcmNvd18yKSwnJyxhcy5jaGFyYWN0ZXIoemFfb3Bpc193c3BvbHR3b3Jjb3dfMikpLA0KICAgICAgICAgdG9fc2FtbyA9IHphX29waXNfd3Nwb2x0d29yY293XzE9PXphX29waXNfd3Nwb2x0d29yY293XzIpICU+JQ0KICBmaWx0ZXIodG9fc2Ftbz09RkFMU0UpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHBhc3RlKHphX29waXNfd3Nwb2x0d29yY293XzEsemFfb3Bpc193c3BvbHR3b3Jjb3dfMixzZXAgPSAiIyIpLA0KICAgICAgICAgemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBzdHJfcmVtb3ZlX2FsbCh6YV9vcGlzX3dzcG9sdHdvcmNvdywiXFwjJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfd3Nwb2x0d29yY293KQ0KDQpvcGlzX3dzcG9sdHdvcmNvdyA8LSBvcGlzX3dzcG9sdHdvcmNvdyAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgemFfb3Bpc193c3BvbHR3b3Jjb3ckWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9waXMpKSAlPiUNCiAgcmVuYW1lKHphX29waXNfd3Nwb2x0d29yY293ID0gb3BpcykNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gemFfb3Bpc193c3BvbHR3b3Jjb3cgJT4lDQogIGJpbmRfcm93cyguLG9waXNfd3Nwb2x0d29yY293KSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzggd3lkYW5pZQ0KbWFyY19maWVsZF8yNTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNTApJT4lDQogIGZpbHRlcihYMjUwIT0iIikgJT4lDQogIG11dGF0ZShYMjUwPXN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVtb3ZlX2FsbChYMjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI1MDwtY2JpbmQobWFyY19maWVsZF8yNTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNTAkWDI1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI1MCRYMjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI1MCRYMjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNTAkWDI1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV93eWRhbmllIDwtIG1hcmNfZmllbGRfMjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIHd5ZGFuaWUgPSBgJGFgKSAlPiUNCiAgbXV0YXRlKHd5ZGFuaWUgPSBzdHJfcmVtb3ZlKHd5ZGFuaWUsIiBcXC8kIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojOTogaW5zdHl0dWNqYSBzcHJhd2N6YQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYMjQ1YykpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7IixYMjQ1Yyksc3RyX3JlcGxhY2VfYWxsKFgyNDVjLCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3Rocyh6YV9pbnN0eXR1Y2phWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgemFfaW5zdHl0dWNqYSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19OQVpXSVNLT1tpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KICB6YV9pbnN0eXR1Y2phJGN6eV9pbWllW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfSU1JRVtpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamEgJT4lDQogIGZpbHRlcihpcy5uYShjenlfbmF6d2lza28pJmlzLm5hKGN6eV9pbWllKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighZ3JlcGwoIl5cXFtbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl18XlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIsaW5zdHl0dWNqYSkpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IHN0cl9yZW1vdmUoaW5zdHl0dWNqYSwiXFwuJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGluc3R5dHVjamEpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTA6IHd5ZGF3bmljdHdvDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNjApICU+JQ0KICBtdXRhdGUoWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwublxcLiIsICJiLncuIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJTXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZW1vdmUoWDI2MCwiXlxcXFwrIiksIA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwgDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCAiLlxcJGMuKiIsICIiKSwgDQogICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgIGlsZV9taWVqc2MgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRhIiksDQogICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChiZXpfcm9rdSwgIlxcJC4iKSksICJbXmEtel0iLCAiIiksDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpLA0KICAgICAgICAgd3lkYXdfcG9kemllbCA9IGlmZWxzZShpbGVfd3lkYXduaWN0dz5pbGVfbWllanNjfGtvbGVqbm9zYz09ImNhYWJiIiwgc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiKFxcJGEpKC4qPykoIDpcXCRiLio/KSggOlxcJGIpIiwgIlxcMVxcMlxcMyA7JGFcXDJcXDQiKSxiZXpfcm9rdSksDQogICAgICAgICB3eWRhd25pY3R3b190ZXN0ID0gc3RyX3JlcGxhY2VfYWxsKHd5ZGF3X3BvZHppZWwsICIoXFwkYikoLio/KSggO1xcJGEpIiwgIlxcMVxcMnxcXDMiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxyb2tfd3lkYW5pYSx3eWRhd25pY3R3b190ZXN0KSAlPiUNCiAgY1NwbGl0KC4sICJ3eWRhd25pY3R3b190ZXN0Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBtdXRhdGUod3lkYXduaWN0d28gPSBzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdCh3eWRhd25pY3R3b190ZXN0KSwgIlxcJFxcdyIsICIiKSwgIlxcVyIsICIiKSkpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3lkYXduaWN0d2EsYnk9Im5hendhX3Byb3N0YSIpICU+JQ0KICBtdXRhdGUodG9fc2FtbyA9IHd5ZGF3bmljdHdvPT1XWV9OQVpXQSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLXRvX3NhbW8sLVdZX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvWzE6M10pKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShXWV9OQVpXQSA9IGlmZWxzZSghaXMubmEoV1lfTkFaV0EpLGFzLmNoYXJhY3RlcihXWV9OQVpXQSksYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdvKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2UoIWlzLm5hKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKG1pZWpzY2Vfd3lkYW5pYSkpLA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwocm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIiksDQogICAgICAgICB6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZShuY2hhcihyb2tfd3lkYW5pYSk9PTQsYXMuY2hhcmFjdGVyKHJva193eWRhbmlhKSxOQSksDQogICAgICAgICBkb19vcGlzdSA9IGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSkscGFzdGUoIlsiLHN0cl9leHRyYWN0KHJva193eWRhbmlhLCJcXGR7NH0iKSwiXSIsc2VwID0gIiIpLCIiKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZShzdWJzdHIoV1lfTUlBU1RPLDEsMSk9PSJbIiZzdWJzdHIoV1lfTUlBU1RPLG5jaGFyKFdZX01JQVNUTyksbmNoYXIoV1lfTUlBU1RPKSkhPSJdIiZpcy5uYShXWV9XWURBV05JQ1RXT19JRCkscGFzdGUodHJpbShXWV9NSUFTVE8pLCJdIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKFdZX01JQVNUTykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSxkb19vcGlzdSkNCg0KIzExOiBvcGlzIGZpenljem55IGtzacSFxbxraQ0KI3BvbGUgMzAwIGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfMzAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMzAwKSU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVwbGFjZV9hbGwoWDMwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgzMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgzMDA9c3RyX3JlbW92ZV9hbGwoWDMwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDMwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzMwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8zMDA8LWNiaW5kKG1hcmNfZmllbGRfMzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMzAwJFgzMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8zMDAkWDMwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8zMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8zMDAkWDMwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMzAwJFgzMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMzAwIDwtIG1hcmNfZmllbGRfMzAwICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRiYCA9IHN0cl9yZW1vdmUoYCRiYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCRlYCA9IGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApJmdyZXBsKCJcXCsgZHlza3xwxYJ5dCIsYCRlYCksc3RyX2V4dHJhY3QoYCRlYCwiKD88PVxcKykoZHlza3xwxYJ5dC4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkNELVJPTXxEVkR8VkNEfENEIixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoXi4qPykoQ0QtUk9NfERWRHxWQ0R8Q0QpKFxcKSl7MCwxfSIpLE5BKSksDQogICAgICAgICBgJGFgID0gaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksDQogICAgICAgICBgJGJgID0gaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGlzLm5hKGAkZWApLCIiLGFzLmNoYXJhY3RlcihgJGVgKSkpDQojcG9sZSA1MDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF81MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIGZpbHRlcighZ3JlcGwoIm9yeWcoXFwufFxcLCkiLFg1MDApJmdyZXBsKCJwc2V1ZHxuYXp3YXxkb3R5Y3p8cG9sIixYNTAwLGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpKQ0KICANCiNwb2xlIDU0NiBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzU0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDU0NiklPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlcGxhY2VfYWxsKFg1NDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDU0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZW1vdmVfYWxsKFg1NDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1NDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81NDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTQ2PC1jYmluZChtYXJjX2ZpZWxkXzU0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzU0NiRYNTQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTQ2JFg1NDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTQ2JFg1NDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzU0NiRYNTQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCg0KemFfb3Bpc19rcyA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byAlPiUgc2VsZWN0KFpBX1VXQUdJLGRvX29waXN1KSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8zMDAgJT4lIHNlbGVjdChaQV9VV0FHSSxYMzAwYT1gJGFgLFgzMDBiPWAkYmAsWDMwMGU9YCRlYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDUwMGE9YCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTQ2ICU+JSBzZWxlY3QoWkFfVVdBR0ksWDU0NmE9YCRhYCksYnk9IlpBX1VXQUdJIikNCnphX29waXNfa3NbaXMubmEoemFfb3Bpc19rcyldICA8LSAiIg0KemFfb3Bpc19rcyA8LSB6YV9vcGlzX2tzICU+JQ0KICBtdXRhdGUoemFfb3Bpc19rcyA9IHBhc3RlKGlmZWxzZShkb19vcGlzdSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKGRvX29waXN1KSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGIhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYiksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwZSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBlKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFg1MDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDUwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDU0NmEhPSIiLGFzLmNoYXJhY3RlcihYNTQ2YSksIiIpLHNlcCA9ICIiKSwNCiAgICAgICAgIHphX29waXNfa3MgPSBzdHJfcmVtb3ZlKHphX29waXNfa3MsIigsICkrJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfa3MpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoemFfb3Bpc19rcykpDQp6YV9vcGlzX2tzJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZCh6YV9vcGlzX2tzWzFdKSkNCnphX29waXNfa3MgPC0gemFfb3Bpc19rc1shZHVwbGljYXRlZCh6YV9vcGlzX2tzJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KQ0KDQojMTI6IHNlcmlhIHd5ZGF3bmljemENCm1hcmNfZmllbGRfNDkwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNDkwLFg4MDAsWDgzMCkgJT4lDQogIG11dGF0ZShYNDkwID0gaWZlbHNlKGdyZXBsKCJVXFwrIixYNDkwKSxhcy5jaGFyYWN0ZXIoWDgzMCksYXMuY2hhcmFjdGVyKFg0OTApKSkgJT4lDQogIG11dGF0ZShYODAwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODAwKSksDQogICAgICAgICBYODMwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODMwKSksDQogICAgICAgICBYODAwID0gc3RyX3JlcGxhY2UoWDgwMCwiKFxcJGEpKC4qKShcXCR0KSIsIlxcMSIpLA0KICAgICAgICAgWDQ5MCA9IGlmZWxzZShYNDkwPT0iIiZYODMwIT0iIixhcy5jaGFyYWN0ZXIoWDgzMCksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShYNDkwPT0iIiZYODAwIT0iIixhcy5jaGFyYWN0ZXIoWDgwMCksYXMuY2hhcmFjdGVyKFg0OTApKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCkgJT4lDQogIGZpbHRlcihYNDkwIT0iIikgJT4lDQogIG11dGF0ZShYNDkwPXN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg0OTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVtb3ZlX2FsbChYNDkwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg0OTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNDkwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNDkwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzQ5MDwtY2JpbmQobWFyY19maWVsZF80OTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF80OTAkWDQ5MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzQ5MCRYNDkwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzQ5MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzQ5MCRYNDkwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF80OTAkWDQ5MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfc2VyaWFfd3lkYXduaWN6YSA8LSBtYXJjX2ZpZWxkXzQ5MCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKD0pKFxcJGEpIiwiXFwxICIpLA0KICAgICAgICAgYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpLA0KICAgICAgICAgYCR2YCA9IGlmZWxzZShpcy5uYShgJHZgKSwiIixhcy5jaGFyYWN0ZXIoYCR2YCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShgJGFgKSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZW1vdmUocGFzdGUoIigiLGAkYWAsIjsgIixgJHZgLCIpIixzZXAgPSAiIiksIjsgKD89XFwpJCkiKSwNCiAgICAgICAgIHNlcmlhID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLHNlcmlhKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxzZXJpYSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gcGFzdGUoc2VyaWEsY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gc3RyX3JlcGxhY2VfYWxsKHNlcmlhLCJcXCQuIiwiOyAiKSkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiMxMzogdG9teQ0KemFfdG9teSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoemFfdG9teSA9IE5BKQ0KDQojMTQ6IGFkbm90YWNqZQ0KemFfYWRub3RhY2plIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLFpBX0FETk9UQUNKRSAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IHBhc3RlKGlmZWxzZShpcy5uYShaQV9BRE5PVEFDSkUueCksIiIscGFzdGUoYXMuY2hhcmFjdGVyKFpBX0FETk9UQUNKRS54KSwiIyAiLHNlcCA9ICIiKSksaWZlbHNlKGlzLm5hKFpBX0FETk9UQUNKRS55KSwiIixhcy5jaGFyYWN0ZXIoWkFfQUROT1RBQ0pFLnkpKSxzZXAgPSAiIiksDQogICAgICAgICBaQV9BRE5PVEFDSkUgPSBzdHJfcmVtb3ZlKFpBX0FETk9UQUNKRSwiKCMgKSskIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKFpBX0FETk9UQUNKRSkpDQp6YV9hZG5vdGFjamUkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZVsxXSkpDQp6YV9hZG5vdGFjamUgPC0gemFfYWRub3RhY2plWyFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZSRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzE1OiBCTl9VUkwNCkJOX1VSTCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQk5fVVJMKQ0KDQojd3lyw7N3bmFuaWUgbGljemJ5IHdpZXJzenkgZG8gbGljemJ5IHdpZXJzenkgb2JpZWt0dSBkYXRhDQpCTl93c3BvbHR3b3JjYSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSAlPiUgc2VsZWN0KFpBX1VXQUdJLE9TX09TT0JBX0lELE9TX05BWldJU0tPLE9TX0lNSUUsZm9fc3ltYm9sKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZGRwbHkoLiwgLihaQV9VV0FHSSksIHN1bW1hcml6ZSwgT1NfT1NPQkFfSUQgPSBwYXN0ZShPU19PU09CQV9JRCwgY29sbGFwc2U9InwiKSwgT1NfTkFaV0lTS08gPSBwYXN0ZShPU19OQVpXSVNLTywgY29sbGFwc2U9InwiKSwgT1NfSU1JRSA9IHBhc3RlKE9TX0lNSUUsIGNvbGxhcHNlPSJ8IiksIGZvX3N5bWJvbCA9IHBhc3RlKGZvX3N5bWJvbCwgY29sbGFwc2U9InwiKSkgJT4lDQogIG11dGF0ZShmb19zeW1ib2wgPSBpZmVsc2UoZm9fc3ltYm9sPT0iTlVMTCIsIk5BIixhcy5jaGFyYWN0ZXIoZm9fc3ltYm9sKSkpDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byAlPiUgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIFdZX1dZREFXTklDVFdPX0lEID0gcGFzdGUoV1lfV1lEQVdOSUNUV09fSUQsIGNvbGxhcHNlPSJ8IiksIFdZX05BWldBID0gcGFzdGUoV1lfTkFaV0EsIGNvbGxhcHNlPSJ8IiksIFdZX01JQVNUTyA9IHBhc3RlKFdZX01JQVNUTywgY29sbGFwc2U9InwiKSwgemFfcm9rX3d5ZGFuaWEgPSBwYXN0ZSh1bmlxdWUoemFfcm9rX3d5ZGFuaWEpLCBjb2xsYXBzZT0ifCIpKSAlPiUNCiAgbXV0YXRlKHphX3Jva193eWRhbmlhID0gaWZlbHNlKHphX3Jva193eWRhbmlhPT0iTkEiLCIiLGFzLmludGVnZXIoemFfcm9rX3d5ZGFuaWEpKSkNCg0KI3BvxYLEhWN6ZW5pZSB3c3p5c3RraWNoIGVsZW1lbnTDs3cgdyBqZWRuxIUgdGFiZWzEmQ0Ka29sZWpub3NjIDwtIGMoIlpBX1VXQUdJIiwiUlpfTkFaV0EiLCJaQV9ST19ST0siLCJaQV9UWVBFIiwiUlpfUk9EWkFKX0lEIiwiRFpfTkFaV0EiLCJEWl9EWklBTF9JRCIsIlRXX1RXT1JDQV9JRCIsIkFNX0FVVE9SX0lEIiwiQU1fTkFaV0lTS08iLCJBTV9JTUlFIiwiWkFfVFlUVUwiLCJaQV9UWVRVTF9PUllHSU5BTFUiLCJaQV9KRVpZS19PUllHSU5BTFUiLCJPU19PU09CQV9JRCIsIk9TX05BWldJU0tPIiwiT1NfSU1JRSIsImZvX3N5bWJvbCIsInphX29waXNfd3Nwb2x0d29yY293Iiwid3lkYW5pZSIsInphX3RvbXkiLCJpbnN0eXR1Y2phIiwiV1lfV1lEQVdOSUNUV09fSUQiLCJXWV9NSUFTVE8iLCJXWV9OQVpXQSIsInphX3Jva193eWRhbmlhIiwiemFfb3Bpc19rcyIsInNlcmlhIiwiVFdfTkFaV0lTS08iLCJUV19JTUlFIiwicmVkYWt0b3JfZHppYWx1IiwiWkFfQUROT1RBQ0pFIiwiQk5fVVJMIikNCnBvbGFjem9uZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixwb2xhX3BibCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvcixieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90eXR1bCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90eXR1bF9vcnlnaW5hbHUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfamV6eWtfb3J5Z2luYWx1LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX29waXNfd3Nwb2x0d29yY293LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3d5ZGFuaWUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfaW5zdHl0dWNqYSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9vcGlzX2tzLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3NlcmlhX3d5ZGF3bmljemEsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdG9teSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9hZG5vdGFjamUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fVVJMLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIHNlbGVjdChub3F1b3RlKGtvbGVqbm9zYykpDQpjb2xuYW1lcyhwb2xhY3pvbmUpIDwtIGMoInJla29yZF9CTiIsInJ6X25hendhIiwiemFfcm9fcm9rIiwiemFfdHlwZSIsInJ6X3JvZHphal9pZCIsIkRaX05BWldBIiwiRFpfRFpJQUxfSUQiLCJ0d190d29yY2FfaWQiLCJhbV9hdXRvcl9pZCIsImFtX25hendpc2tvIiwiYW1faW1pZSIsInphX3R5dHVsIiwiemFfdHl0dWxfb3J5Z2luYWx1IiwiemFfamV6eWtfb3J5Z2luYWx1Iiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsIm9zX2ltaWUiLCJmb19zeW1ib2wiLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsInphX3d5ZGFuaWUiLCJ6YV90b215IiwiemFfaW5zdHl0dWNqYSIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiwiemFfcm9rX3d5ZGFuaWEiLCJ6YV9vcGlzX2Zpenljem55X2tzaWF6a2kiLCJ6YV9zZXJpYV93eWRhd25pY3phIiwidHdfbmF6d2lza28iLCJ0d19pbWllIiwicHJhY293bmlrIiwiemFfYWRub3RhY2plIiwiQk5fVVJMIikNCg0KI3phc3lnbmFsaXpvd2FuaWUgbmllcG9wcmF3bmVnbyBrb2Rvd2FuaWENCnggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIjxVXFwrKC4uLi4pPiIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSE9MCxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgQsWCxIVkIGtvZG93YW5pYSB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiBabmFqZMW6IGZyYXrEmSBcIj8/P1wiIGkgenJlZGFndWogcG9sZSIsc2VwID0gIiIpLHNlcCA9ICIjICIpLHBhc3RlKCJVV0FHQSEgQsWCxIVkIGtvZG93YW5pYSB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiBabmFqZMW6IGZyYXrEmSBcIj8/P1wiIGkgenJlZGFndWogcG9sZSIsc2VwID0gIiIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQogIHBvbGFjem9uZVssaV0gPC0gZ3N1YigiPFVcXCsoLi4uLik+IiwgIj8/PyIsIHBvbGFjem9uZVssaV0pDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIHpuYWt1ICQgdyBrdMOzcnltxZsgeiBww7NsDQpYIDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJcXCQiLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyB6bmFrIFwiJFwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIikscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIHpuYWsgXCIkXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSBmcmF6eSAiY2hhcmFjdGVyKDApIiB3IGt0w7NyeW3FmyB6IHDDs2wNClggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoImNoYXJhY3RlclxcKDBcXCkiLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyBmcmF6xJkgXCJjaGFyYWN0ZXIoMClcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyBmcmF6xJkgXCJjaGFyYWN0ZXIoMClcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIHpuYWt1ICMgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8Ozdw0KcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIlxcIyIscG9sYWN6b25lJHphX29waXNfd3Nwb2x0d29yY293KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEga29uZmxpa3QgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8OzdyB3eWJpZXJ6IHfFgmHFm2Npd8SFIHdhcnRvxZvEhyAoc3RyZWZhIG9kcG93aWVkemlhbG5vxZtjaSBcIiNcIiB3c3DDs8WCdHfDs3JjeSB6IHBvbGEgNzAwKSIscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSwiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGtvbmZsaWt0IHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cgd3liaWVyeiB3xYJhxZtjaXfEhSB3YXJ0b8WbxIcgKHN0cmVmYSBvZHBvd2llZHppYWxub8WbY2kgIyB3c3DDs8WCdHfDs3JjeSB6IHBvbGEgNzAwKSIsc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCiNrb3Jla3RhIGF1dG9tYXR5Y3puZWdvIElPSw0KYXV0b21hdHljem55X0lPSyA8LSBwb2xhY3pvbmUgJT4lDQogIG11dGF0ZShjenlfdHl0X29yeWcgPSAoIWdyZXBsKCJwb2xzayIsRFpfTkFaV0EpJiFpcy5uYSh6YV90eXR1bF9vcnlnaW5hbHUpKXxncmVwbCgicG9sc2siLERaX05BWldBKSkgJT4lDQogIGZpbHRlcih6YV9hZG5vdGFjamU9PSIiJmFtX25hendpc2tvIT0iTkEiJiFncmVwbCgicHNldWR8bmF6dyIsemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSYhZ3JlcGwoIlxcfCIsYW1fbmF6d2lza28pJmN6eV90eXRfb3J5Zz09VFJVRSkgJT4lDQogIHNlbGVjdChyZWtvcmRfQk4pICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKHJla29yZF9CTiAlbm90aW4lIGRhdGEkWkFfVVdBR0lbZGF0YSRjenlfYXV0b21hdHljem5pZT09Im5pZSJdKSAlPiUNCiAgbXV0YXRlKGF1dG9tYXR5Y3pueV9pbXBvcnQgPSAidGFrIikNCg0Kd3JpdGUuY3N2MihhdXRvbWF0eWN6bnlfSU9LLCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvaW1wXzIwMDlfYXV0b21hdHljem5lX2FudG9sb2dpZS5jc3YiLCByb3cubmFtZXMgPSBGLCBuYSA9ICcnLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgnKQ0KDQpvdXQgPC0gY1NwbGl0KHBvbGFjem9uZSwgYygiYW1fYXV0b3JfaWQiLCAiYW1fbmF6d2lza28iLCAiYW1faW1pZSIsIm9zX29zb2JhX2lkIiwib3NfbmF6d2lza28iLCAib3NfaW1pZSIsICJmb19zeW1ib2wiLCJ3eV93eWRhd25pY3R3b19pZCIsInd5X21pZWpzY2UiLCJ3eV9uYXp3YSIpLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKQ0KDQpvdXQkcmVrb3JkX0JOIDwtIGlmZWxzZShpcy5uYShvdXQkcmVrb3JkX0JOKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJla29yZF9CTikpDQpvdXQkcnpfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKG91dCRyel9uYXp3YSksJycsYXMuY2hhcmFjdGVyKG91dCRyel9uYXp3YSkpDQpvdXQkemFfcm9fcm9rIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9fcm9rKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3JvX3JvaykpDQpvdXQkemFfdHlwZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5cGUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHlwZSkpDQpvdXQkcnpfcm9kemFqX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfcm9kemFqX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJ6X3JvZHphal9pZCkpDQpvdXQkRFpfTkFaV0EgPC0gaWZlbHNlKGlzLm5hKG91dCREWl9OQVpXQSksJycsYXMuY2hhcmFjdGVyKG91dCREWl9OQVpXQSkpDQpvdXQkRFpfRFpJQUxfSUQgPC0gaWZlbHNlKGlzLm5hKG91dCREWl9EWklBTF9JRCksJycsYXMuY2hhcmFjdGVyKG91dCREWl9EWklBTF9JRCkpDQpvdXQkdHdfdHdvcmNhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfdHdvcmNhX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X3R3b3JjYV9pZCkpDQpvdXQkYW1fYXV0b3JfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9hdXRvcl9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9hdXRvcl9pZCkpDQpvdXQkYW1fbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9uYXp3aXNrbykpDQpvdXQkYW1faW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JGFtX2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1faW1pZSkpDQpvdXQkemFfdHl0dWwgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXR1bCksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bCkpDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1IDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWxfb3J5Z2luYWx1KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5dHVsX29yeWdpbmFsdSkpDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1IDwtIGlmZWxzZShpcy5uYShvdXQkemFfamV6eWtfb3J5Z2luYWx1KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2plenlrX29yeWdpbmFsdSkpDQpvdXQkb3Nfb3NvYmFfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19vc29iYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRvc19vc29iYV9pZCkpDQpvdXQkb3NfbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCRvc19uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCRvc19uYXp3aXNrbykpDQpvdXQkb3NfaW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JG9zX2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfaW1pZSkpDQpvdXQkZm9fc3ltYm9sIDwtIGlmZWxzZShpcy5uYShvdXQkZm9fc3ltYm9sKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGZvX3N5bWJvbCkpDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdyksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdykpDQpvdXQkemFfd3lkYW5pZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3d5ZGFuaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfd3lkYW5pZSkpDQpvdXQkemFfdG9teSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3RvbXkpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdG9teSkpDQpvdXQkemFfaW5zdHl0dWNqYSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2luc3R5dHVjamEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfaW5zdHl0dWNqYSkpDQpvdXQkd3lfd3lkYXduaWN0d29faWQgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV93eWRhd25pY3R3b19pZCksJycsYXMuY2hhcmFjdGVyKG91dCR3eV93eWRhd25pY3R3b19pZCkpDQpvdXQkd3lfbWllanNjZSA8LSBpZmVsc2UoaXMubmEob3V0JHd5X21pZWpzY2UpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbWllanNjZSkpDQpvdXQkd3lfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9uYXp3YSksJycsYXMuY2hhcmFjdGVyKG91dCR3eV9uYXp3YSkpDQpvdXQkemFfcm9rX3d5ZGFuaWEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9yb2tfd3lkYW5pYSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb2tfd3lkYW5pYSkpDQpvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSkpDQpvdXQkemFfc2VyaWFfd3lkYXduaWN6YSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfc2VyaWFfd3lkYXduaWN6YSkpDQpvdXQkdHdfbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCR0d19uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCR0d19uYXp3aXNrbykpDQpvdXQkdHdfaW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JHR3X2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfaW1pZSkpDQpvdXQkcHJhY293bmlrIDwtIGlmZWxzZShpcy5uYShvdXQkcHJhY293bmlrKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHByYWNvd25paykpDQpvdXQkemFfYWRub3RhY2plIDwtIGlmZWxzZShpcy5uYShvdXQkemFfYWRub3RhY2plKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2Fkbm90YWNqZSkpDQpvdXQkQk5fVVJMIDwtIGlmZWxzZShpcy5uYShvdXQkQk5fVVJMKSwnJyxhcy5jaGFyYWN0ZXIob3V0JEJOX1VSTCkpDQoNCm91dCAlJCUgIA0KICAgIHsgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpICYgQk5fVVJMPT1sYWcoQk5fVVJMLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBvdXQkc2FtZQ0Kb3V0JHNhbWVbMV0gPC0gMA0Kb3V0JGR6aWVsb25lIDwtIHBhc3RlKG91dCRhbV9hdXRvcl9pZCxvdXQkYW1fbmF6d2lza28sb3V0JGFtX2ltaWUsb3V0JG9zX29zb2JhX2lkLG91dCRvc19uYXp3aXNrbyxvdXQkb3NfaW1pZSxvdXQkZm9fc3ltYm9sLG91dCR3eV93eWRhd25pY3R3b19pZCxvdXQkd3lfbWllanNjZSxvdXQkd3lfbmF6d2Esc2VwID0gIiIpDQoNCm91dCA8LSBvdXQgJT4lDQogIGZpbHRlcighKHNhbWU9PTEmZHppZWxvbmU9PSIiKSkgJT4lDQogIHNlbGVjdCgxOjMzKQ0KDQpvdXQgJSQlICANCiAgICB7IHJla29yZF9CTj09bGFnKHJla29yZF9CTiwpICYgcnpfbmF6d2E9PWxhZyhyel9uYXp3YSwpICYgemFfcm9fcm9rPT1sYWcoemFfcm9fcm9rLCkgJiB6YV90eXBlPT1sYWcoemFfdHlwZSwpICYgcnpfcm9kemFqX2lkPT1sYWcocnpfcm9kemFqX2lkLCkgJiBEWl9OQVpXQT09bGFnKERaX05BWldBLCkgJiBEWl9EWklBTF9JRD09bGFnKERaX0RaSUFMX0lELCkgJiB0d190d29yY2FfaWQ9PWxhZyh0d190d29yY2FfaWQsKSAmIHphX3R5dHVsPT1sYWcoemFfdHl0dWwsKSAmIHphX3R5dHVsX29yeWdpbmFsdT09bGFnKHphX3R5dHVsX29yeWdpbmFsdSwpICYgemFfamV6eWtfb3J5Z2luYWx1PT1sYWcoemFfamV6eWtfb3J5Z2luYWx1LCkgJiB6YV9vcGlzX3dzcG9sdHdvcmNvdz09bGFnKHphX29waXNfd3Nwb2x0d29yY293LCkgJiB6YV93eWRhbmllPT1sYWcoemFfd3lkYW5pZSwpICYgemFfdG9teT09bGFnKHphX3RvbXksKSAmIHphX2luc3R5dHVjamE9PWxhZyh6YV9pbnN0eXR1Y2phLCkgJiB6YV9yb2tfd3lkYW5pYT09bGFnKHphX3Jva193eWRhbmlhLCkgJiB6YV9vcGlzX2Zpenljem55X2tzaWF6a2k9PWxhZyh6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksKSAmIHphX3NlcmlhX3d5ZGF3bmljemE9PWxhZyh6YV9zZXJpYV93eWRhd25pY3phLCkgJiB0d19uYXp3aXNrbz09bGFnKHR3X25hendpc2tvLCkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpICYgcHJhY293bmlrPT1sYWcocHJhY293bmlrLCkgJiB6YV9hZG5vdGFjamU9PWxhZyh6YV9hZG5vdGFjamUsKSAmIEJOX1VSTD09bGFnKEJOX1VSTCwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCg0KI3VjacSZY2llIHpieXQgZMWCdWdpY2ggY2nEhWfDs3cgem5ha8OzdywgYnkgd2VzesWCeSBkbyBvcmFjbGUnYQ0KZGx1Z29zY2kgPC0gZGF0YS5mcmFtZShwb2xlID0gYygiYW1fbmF6d2lza28iLCAiYW1faW1pZSIsICJ6YV90eXR1bCIsICJ6YV90eXR1bF9vcnlnaW5hbHUiLCAiemFfamV6eWtfb3J5Z2luYWx1IiwgIm9zX25hendpc2tvIiwgIm9zX2ltaWUiLCAiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCAiemFfaW5zdHl0dWNqYSIsICJ3eV9taWVqc2NlIiwgInd5X25hendhIiwgInphX29waXNfZml6eWN6bnlfa3NpYXpraSIsICJ6YV9zZXJpYV93eWRhd25pY3phIiwgInR3X25hendpc2tvIiwgInR3X2ltaWUiLCAiemFfYWRub3RhY2plIiksIGxpY3piYV96bmFrb3cgPSBjKDUwLDQwLDUwMCw1MDAsMTAwLDUwLDQwLDUwMCwyNTUsNDAsMjU1LDEwMDAsMjU1LDIwMCw0MCwyMDAwKSkNCnggPC0gbWF0Y2goZGx1Z29zY2kkcG9sZSxuYW1lcyhvdXQpKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBkbHVnb3NjIDwtIGRsdWdvc2NpJGxpY3piYV96bmFrb3dbbWF0Y2gobmFtZXMob3V0W2ldKSxkbHVnb3NjaSRwb2xlKV0NCiAgb3V0JHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpJm91dCR6YV9hZG5vdGFjamUhPSIiLHBhc3RlKG91dCR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBQb2xlICIsYXMuY2hhcmFjdGVyKG5hbWVzKG91dFtpXSkpLCIgYnnFgm8gemJ5dCBkxYJ1Z2llIGkgem9zdGHFgm8gcHJ6eWNpxJl0ZS4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpJm91dCR6YV9hZG5vdGFjamU9PSIiLHBhc3RlKCJVV0FHQSEgUG9sZSAiLGFzLmNoYXJhY3RlcihuYW1lcyhvdXRbaV0pKSwiIGJ5xYJvIHpieXQgZMWCdWdpZSBpIHpvc3RhxYJvIHByenljacSZdGUuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxhcy5jaGFyYWN0ZXIob3V0JHphX2Fkbm90YWNqZSkpKQ0KICANCiAgb3V0WyxpXSA8LSBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpLGFzLmNoYXJhY3RlcihzdWJzdHIob3V0WyxpXSwxLGRsdWdvc2MpKSxhcy5jaGFyYWN0ZXIob3V0WyxpXSkpDQp9DQoNCm91dCRyZWtvcmRfQk5bb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRyel9uYXp3YVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3JvX3Jva1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5cGVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRyel9yb2R6YWpfaWRbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCREWl9OQVpXQVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JERaX0RaSUFMX0lEW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfdHdvcmNhX2lkW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHl0dWxbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXR1bF9vcnlnaW5hbHVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9qZXp5a19vcnlnaW5hbHVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9vcGlzX3dzcG9sdHdvcmNvd1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3d5ZGFuaWVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90b215W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfaW5zdHl0dWNqYVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3Jva193eWRhbmlhW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfc2VyaWFfd3lkYXduaWN6YVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X25hendpc2tvW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfaW1pZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHByYWNvd25pa1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2Fkbm90YWNqZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JEJOX1VSTFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0KDQojcHJ6eXBpc2FuaWUgZG8gYXV0b21hdHljem5lZ28gT0sgcmVkYWt0b3JhICJhdXRvbWF0Ig0Kb3V0IDwtIG91dCAlPiUNCiAgbXV0YXRlKHByYWNvd25payA9IGlmZWxzZShyZWtvcmRfQk4gJWluJSBhdXRvbWF0eWN6bnlfSU9LJHJla29yZF9CTiwiQVVUT01BVCIsYXMuY2hhcmFjdGVyKHByYWNvd25paykpKSAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCiNwxJl0bGEgemFwaXN1asSFY2EgcG8gb2suIDIwMDAgd2llcnN6eSB6IHV3emdsxJlkbmllbmllbSBrb21wbGV0bm/Fm2NpIHJla29yZMOzdyBiaWJsaW9ncmFmaWN6bnljaCByb3pwaXNhbnljaCBuYSBraWxrYSB3aWVyc3p5DQpvdXQgPC0gb3V0ICU+JQ0KICBtdXRhdGUocG9kemlhbCA9IGlmZWxzZShyZWtvcmRfQk4hPSIiLGFzLmNoYXJhY3RlcihyZWtvcmRfQk4pLE5BKSkgJT4lDQogIGZpbGwocG9kemlhbCkNCmlsZSA8LSB1bmlxdWUob3V0JHBvZHppYWwpDQppbGUgPC0gc3BsaXQodW5pcXVlKGlsZSksIGNlaWxpbmcoc2VxX2Fsb25nKHVuaXF1ZShpbGUpKS8xNTAwKSkNCg0KeCA8LSAxOmxlbmd0aChpbGUpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGZpbmFsIDwtIG91dCAlPiUNCiAgICBmaWx0ZXIocG9kemlhbCAlaW4lIGlsZVtbaV1dKSAlPiUNCiAgICBzZWxlY3QoLXBvZHppYWwpDQogIHdyaXRlLnhsc3goZmluYWwsIHBhc3RlKCJDOi9Vc2Vycy9DZXphcnkvRGVza3RvcC8yMDA5X2FudG9sb2dpZV9kb19pbXBvcnR1IixpLCIueGxzeCIsc2VwID0gIiIpLHNoZWV0TmFtZSA9ICJnb3Rvd2UiKQ0KfQ0KYGBgDQoNCmBgYHtyIGtzacSFxbxraSB3c3DDs8WCd3lkYW5pYX0NCmRhdGEgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09IndzcMOzxYJ3eWRhbmllIikgJT4lDQogIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBwYXN0ZShyZWRha3Rvcl9kemlhbHUsIl93c3AiLHNlcCA9ICIiKSkNCg0KDQpkYXRhIDwtIGhhcmxlcXVpbnkNCmRhdGEkWDI0NSA8LSBzdHJfcmVwbGFjZV9hbGwoZGF0YSRYMjQ1LCAiXFxdXFwuICIsICJdfCRhIikNCmRhdGEkWDI0NSA8LSBzdHJfcmVwbGFjZV9hbGwoZGF0YSRYMjQ1LCAiXFwvW15cXCRdIiwgIi8kYyIpDQpkYXRhIDwtIGNTcGxpdChkYXRhLCBjKCJYMjQ1IiwgIlgyNDYiKSwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpDQpkYXRhIDwtIGRhdGEuZnJhbWUoZGF0YSwgbGljem5payA9IDE6bGVuZ3RoKGRhdGEkaWQpKQ0KDQojdXdvbG5pZW5pZSBrb2x1bW4geiBkYW55bWkgeiBibiBpIHByemV0d29yemVuaWUgZG8gUEJMDQojMQ0KemFfdXdhZ2kgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KHphX3V3YWdpID0gaWQsIGxpY3puaWspDQp6YV91d2FnaSR6YV91d2FnaSA8LSBzdHJfcmVwbGFjZV9hbGwoemFfdXdhZ2kkemFfdXdhZ2ksIiAiLCIwIikNCnphX3V3YWdpJHphX3V3YWdpIDwtIGlmZWxzZShuY2hhcih6YV91d2FnaSR6YV91d2FnaSk9PTEzLHphX3V3YWdpJHphX3V3YWdpLCBzcHJpbnRmKCIlMDEzZCIsIGFzLmludGVnZXIoemFfdXdhZ2kkemFfdXdhZ2kpKSkNCg0KemFfdXdhZ2kgJSQlICANCiAgICB7IHphX3V3YWdpID09IGRwbHlyOjpsYWcoemFfdXdhZ2ksIDEpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gemFfdXdhZ2kkc2FtZQ0KemFfdXdhZ2kkc2FtZVsxXSA8LSAwDQp6YV91d2FnaSR6YV91d2FnaSA8LSBpZmVsc2UoemFfdXdhZ2kkc2FtZT09MSxwYXN0ZSh6YV91d2FnaSR6YV91d2FnaSwiXzIiLCBzZXAgPSAiIiksemFfdXdhZ2kkemFfdXdhZ2kpDQoNCnphX3V3YWdpIDwtIHphX3V3YWdpICU+JQ0KICBzZWxlY3QoMSwyKQ0KIzINCnJ6X25hendhIDwtIGRhdGEuZnJhbWUocnpfbmF6d2EgPSByZXAoImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIsIGxlbmd0aCgxOmxlbmd0aCh6YV91d2FnaSR6YV91d2FnaSkpKSkNCnJ6X25hendhIDwtIGRhdGEuZnJhbWUocnpfbmF6d2EgPSByel9uYXp3YSRyel9uYXp3YSwgbGljem5payA9IDE6bGVuZ3Rocyhyel9uYXp3YSkpDQojMw0KemFfcm9fcm9rIDwtIGRhdGEgJT4lDQogIHNlbGVjdCh6YV9yb19yb2sgPSByb2ssIGxpY3puaWspDQojNA0KemFfdHlwZSA8LSBkYXRhLmZyYW1lKGxpY3puaWsgPSBkYXRhJGxpY3puaWssIHphX3R5cGUgPSAiS1MiKQ0KIzUNCnJ6X3JvZHphal9pZCA8LSBtZXJnZSh4ID0gcnpfbmF6d2EsIHkgPSBQQkxfcm9kemFqZV96YXBpc293LCBieS54ID0gJ3J6X25hendhJywgYnkueSA9ICdSWl9OQVpXQScsIHNvcnQgPSBGQUxTRSxhbGwueCA9IFRSVUUpDQpyel9yb2R6YWpfaWQgPC0gcnpfcm9kemFqX2lkW29yZGVyKHJ6X3JvZHphal9pZCRsaWN6bmlrKSxdDQpyel9yb2R6YWpfaWQgPC0gcnpfcm9kemFqX2lkICU+JQ0KICBzZWxlY3QoUlpfUk9EWkFKX0lELCBsaWN6bmlrKQ0KIzYNCkJOX2F1dG9yIDwtIGRhdGEuZnJhbWUoYXV0b3J6eSA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCAiKD88PVxcL1xcJGMpKC4qKSg/PSA7KSIpKSwgbGljem5payA9IGRhdGEkbGljem5paykNCkJOX2F1dG9yIDwtIG11dGF0ZShCTl9hdXRvciwNCiAgICAgICAgICAgICAgICAgICBuYXp3YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIoQk5fYXV0b3IkYXV0b3J6eSksICJcXFciLCAiIikpDQoNCm5hendhMiA8LSBpZmVsc2UoaXMubmEoUEJMX2F1dG9yenkkQU1fSU1JRSksYXMuY2hhcmFjdGVyKFBCTF9hdXRvcnp5JEFNX05BWldJU0tPKSxwYXN0ZShQQkxfYXV0b3J6eSRBTV9JTUlFLFBCTF9hdXRvcnp5JEFNX05BWldJU0tPLCBzZXAgPSAiIikpDQpuYXp3YTIgPC0gZGF0YS5mcmFtZShuYXp3YTIgPSBzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKG5hendhMiwgIlxcVyIsICIiKSkpDQpuYXp3YTIgPC0gZGF0YS5mcmFtZShuYXp3YTIgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKG5hendhMiRuYXp3YTIpLCAiXFxXIiwgIiIpKQ0KUEJMX2F1dG9yenkgPC0gZGF0YS5mcmFtZShQQkxfYXV0b3J6eSwgbmF6d2EyID0gbmF6d2EyJG5hendhMikNClBCTF9hdXRvcnp5IDwtIFBCTF9hdXRvcnp5ICU+JQ0KICBmaWx0ZXIobmF6d2EyICE9ICJuYW5hIikNCg0KQk5fUEJMX2F1dG9yIDwtIG1lcmdlKHggPSBCTl9hdXRvciwgeSA9IFBCTF9hdXRvcnp5LCBieS54ID0gJ25hendhJywgYnkueSA9ICduYXp3YTInLCBzb3J0ID0gRkFMU0UsIGFsbC54ID0gVFJVRSkNCkJOX1BCTF9hdXRvciA8LSBCTl9QQkxfYXV0b3Jbb3JkZXIoQk5fUEJMX2F1dG9yJGxpY3puaWssIEJOX1BCTF9hdXRvciRBTV9BVVRPUl9JRCksXQ0KDQpCTl9QQkxfYXV0b3IgPC0gQk5fUEJMX2F1dG9yW29yZGVyKEJOX1BCTF9hdXRvciRsaWN6bmlrLCAtQk5fUEJMX2F1dG9yJEFNX0xJQ1pCQV9aQVBJU09XKSxdDQoNCkJOX1BCTF9hdXRvciAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpIH0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IEJOX1BCTF9hdXRvciRzYW1lDQpCTl9QQkxfYXV0b3Ikc2FtZVsxXSA8LSAwDQoNCkJOX1BCTF9hdXRvciA8LSBCTl9QQkxfYXV0b3IgJT4lDQogIGZpbHRlcihzYW1lPT0wKSAlPiUNCiAgc2VsZWN0KDE6MTQpDQpjb2xuYW1lcyhCTl9QQkxfYXV0b3IpWzE0XSA8LSAibmF6d2FfbmF6X2ltIg0KQk5fYXV0b3JfcG9kemllbG9ueSA8LSBkYXRhLmZyYW1lKGF1dG9yID0gc3RyX3JlcGxhY2VfYWxsKEJOX2F1dG9yJGF1dG9yenksICIoICg/IS4qICkpIiwifCIpLCBsaWN6bmlrID0gQk5fYXV0b3IkbGljem5paykNCkJOX2F1dG9yX3BvZHppZWxvbnkgPC0gY1NwbGl0KEJOX2F1dG9yX3BvZHppZWxvbnksIGMoImF1dG9yIiksIHNlcCA9ICJ8IiwgZGlyZWN0aW9uID0gIndpZGUiKQ0KQk5fUEJMX2F1dG9yIDwtIG1lcmdlKEJOX1BCTF9hdXRvcixCTl9hdXRvcl9wb2R6aWVsb255LGJ5ID0gImxpY3puaWsiLCBhbGwgPSBUUlVFKQ0KDQphbV9hdXRvcl9pZCA8LSBCTl9QQkxfYXV0b3IgJT4lDQogIHNlbGVjdChsaWN6bmlrLCBBTV9BVVRPUl9JRCkNCiM3DQphbV9uYXp3aXNrbyA8LSBkYXRhLmZyYW1lKG5hendpc2tvID0gQk5fYXV0b3JfcG9kemllbG9ueSRhdXRvcl8yLCBsaWN6bmlrID0gQk5fYXV0b3JfcG9kemllbG9ueSRsaWN6bmlrKQ0KYXV0X2lkX25hencgPC0gbWVyZ2UoeCA9IGFtX25hendpc2tvLCB5ID0gYW1fYXV0b3JfaWQsIGJ5ID0gImxpY3puaWsiLCBhbGwueD1UUlVFKQ0KYW1fbmF6d2lza28gPC0gZGF0YS5mcmFtZShhbV9uYXp3aXNrbyA9IGlmZWxzZShpcy5uYShhdXRfaWRfbmF6dyRBTV9BVVRPUl9JRCksYXMuY2hhcmFjdGVyKGF1dF9pZF9uYXp3JG5hendpc2tvKSwgTkEpLCBsaWN6bmlrID0gYXV0X2lkX25henckbGljem5paykNCiM4DQphbV9pbWllIDwtIGRhdGEuZnJhbWUoaW1pZSA9IEJOX2F1dG9yX3BvZHppZWxvbnkkYXV0b3JfMSwgbGljem5payA9IEJOX2F1dG9yX3BvZHppZWxvbnkkbGljem5paykNCmF1dF9pZF9pbWllIDwtIG1lcmdlKHggPSBhbV9pbWllLCB5ID0gYW1fYXV0b3JfaWQsIGJ5ID0gImxpY3puaWsiLCBhbGwueD1UUlVFKQ0KYW1faW1pZSA8LSBkYXRhLmZyYW1lKGFtX2ltaWUgPSBpZmVsc2UoaXMubmEoYXV0X2lkX2ltaWUkQU1fQVVUT1JfSUQpLGFzLmNoYXJhY3RlcihhdXRfaWRfaW1pZSRpbWllKSwgTkEpLCBsaWN6bmlrID0gYXV0X2lkX25henckbGljem5paykNCiM5DQp0d190d29yY2FfaWQgPC0gbWVyZ2UoeCA9IEJOX1BCTF9hdXRvciwgeSA9IFBCTF9hdXRvcl90b190d29yY2EsIGJ5LnggPSAnQU1fQVVUT1JfSUQnLCBieS55ID0gJ2lkIGF1dG9yYScsIHNvcnQgPSBGQUxTRSwgYWxsLnggPSBUUlVFKQ0KdHdfdHdvcmNhX2lkIDwtIG1lcmdlKHggPSB0d190d29yY2FfaWQsIHkgPSBQQkxfdHdvcmN5LCBieS54ID0gJ2lkIHR3b3JjeScsIGJ5LnkgPSAnVFdfVFdPUkNBX0lEJywgc29ydCA9IEZBTFNFLCBhbGwueCA9IFRSVUUpDQp0d190d29yY2FfaWQgPC0gdHdfdHdvcmNhX2lkICU+JQ0KICBzZWxlY3QobGljem5payxgaWQgdHdvcmN5YCxBTV9OQVpXSVNLTz1hdXRvcl8yLEFNX0lNSUU9YXV0b3JfMSwgRFpfTkFaV0EsIFRXX0RaX0RaSUFMX0lEKQ0KdHdfdHdvcmNhX2lkJGBpZCB0d29yY3lgW3R3X3R3b3JjYV9pZCRUV19EWl9EWklBTF9JRD09NDMwXSA8LSBOQQ0KdHdfdHdvcmNhX2lkJEFNX05BWldJU0tPW3R3X3R3b3JjYV9pZCRUV19EWl9EWklBTF9JRD09NDMwXSA8LSBOQQ0KdHdfdHdvcmNhX2lkJEFNX0lNSUVbdHdfdHdvcmNhX2lkJFRXX0RaX0RaSUFMX0lEPT00MzBdIDwtIE5BDQpCTl9QQkxfdHdvcmNhIDwtIHR3X3R3b3JjYV9pZCAlPiUNCiAgICBzZWxlY3QoMSxUV19UV09SQ0FfSUQgPSAyLFRXX05BWldJU0tPID0gMyxUV19JTUlFID0gNCxEWl9OQVpXQSxUV19EWl9EWklBTF9JRCkNCg0KdHdfdHdvcmNhX2lkIDwtIHR3X3R3b3JjYV9pZCAlPiUNCiAgc2VsZWN0KDEsVFdfVFdPUkNBX0lEID0gMixUV19OQVpXSVNLTyA9IDMsVFdfSU1JRSA9IDQpDQoNCnR3X3R3b3JjYV9pZCA8LSB0d190d29yY2FfaWRbb3JkZXIodHdfdHdvcmNhX2lkJGxpY3puaWssdHdfdHdvcmNhX2lkJFRXX1RXT1JDQV9JRCx0d190d29yY2FfaWQkVFdfTkFaV0lTS08sdHdfdHdvcmNhX2lkJFRXX0lNSUUpLF0NCnR3X3R3b3JjYV9pZCA8LSB0d190d29yY2FfaWQgJT4lDQogIHVuaXF1ZSgpDQp0d190d29yY2FfaWQgJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSB9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiB0d190d29yY2FfaWQkc2FtZQ0KdHdfdHdvcmNhX2lkJHNhbWVbMV0gPC0gMA0KdHdfdHdvcmNhX2lkIDwtIHR3X3R3b3JjYV9pZCAlPiUNCiAgZmlsdGVyKHNhbWU9PTApICU+JQ0KICBzZWxlY3QoLWxlbmd0aCh0d190d29yY2FfaWQpKQ0KIzEwDQp0d19uYXp3aXNrbyA8LSB0d190d29yY2FfaWQNCnR3X25hendpc2tvJFRXX05BWldJU0tPWyFpcy5uYSh0d19uYXp3aXNrbyRUV19UV09SQ0FfSUQpXSA8LSBOQQ0KdHdfbmF6d2lza28gPC0gdHdfbmF6d2lza28gJT4lDQogIHNlbGVjdChsaWN6bmlrLFRXX05BWldJU0tPKQ0KIzExDQp0d19pbWllIDwtIHR3X3R3b3JjYV9pZA0KdHdfaW1pZSRUV19JTUlFWyFpcy5uYSh0d19pbWllJFRXX1RXT1JDQV9JRCldIDwtIE5BDQp0d19pbWllIDwtIHR3X2ltaWUgJT4lDQogIHNlbGVjdChsaWN6bmlrLFRXX0lNSUUpDQojMTINCkJOX1BCTF90d29yY2EgPC0gQk5fUEJMX3R3b3JjYVtvcmRlcihCTl9QQkxfdHdvcmNhJGxpY3puaWssQk5fUEJMX3R3b3JjYSRUV19UV09SQ0FfSUQsQk5fUEJMX3R3b3JjYSRUV19OQVpXSVNLTyxCTl9QQkxfdHdvcmNhJFRXX0lNSUUpLF0NCkJOX1BCTF90d29yY2EgPC0gQk5fUEJMX3R3b3JjYSAlPiUNCiAgdW5pcXVlKCkNCkJOX1BCTF90d29yY2EgJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSB9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBCTl9QQkxfdHdvcmNhJHNhbWUNCkJOX1BCTF90d29yY2Ekc2FtZVsxXSA8LSAwDQpCTl9QQkxfdHdvcmNhIDwtIEJOX1BCTF90d29yY2EgJT4lDQogIGZpbHRlcihzYW1lPT0wKSAlPiUNCiAgc2VsZWN0KC1sZW5ndGgoQk5fUEJMX3R3b3JjYSkpDQoNCmR6X25hendhX2Z1bGwgPC0gQk5fUEJMX3R3b3JjYQ0KZHpfbmF6d2FfZnVsbCA8LSBkel9uYXp3YV9mdWxsW29yZGVyKGR6X25hendhX2Z1bGwkbGljem5payksXQ0KDQojZHppYcWCIG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5DQpsaXRlcmF0dXJhX0JOIDwtIEJOX1BCTF90d29yY2EgJT4lDQogICAgc2VsZWN0KGxpY3puaWssVFdfVFdPUkNBX0lELFRXX05BWldJU0tPLFRXX0lNSUUpDQoNCm1hcmNfZmllbGRfNjU1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChsaWN6bmlrLFg2NTUpJT4lDQogIGZpbHRlcihYNjU1IT0iIikNCm1hcmNfZmllbGRfNjU1JFg2NTU8LXN0cl9yZXBsYWNlX2FsbChtYXJjX2ZpZWxkXzY1NSRYNjU1LCIoXnxcXHwpIiwiflxcMSIpDQptYXJjX2ZpZWxkXzY1NTwtIGNTcGxpdChtYXJjX2ZpZWxkXzY1NSwiWDY1NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikNCm1hcmNfZmllbGRfNjU1PC0gbWFyY19maWVsZF82NTUlPiUNCiAgZmlsdGVyKFg2NTUhPSIiKQ0KbWFyY19maWVsZF82NTUkWDY1NTwtc3RyX3JlbW92ZV9hbGwobWFyY19maWVsZF82NTUkWDY1NSwiXlxcfCIpDQptYXJjX2ZpZWxkXzY1NSA8LSBtdXRhdGUobWFyY19maWVsZF82NTUsDQogICAgICAgICAgICAgICBpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwobWFyY19maWVsZF82NTUkWDY1NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg2NTUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCg0KbWFyY19maWVsZF82NTU8LWNiaW5kKG1hcmNfZmllbGRfNjU1LGVtcHR5X3RhYmxlKQ0KDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KDQpmb3IgKGkgaW4geCkgew0KICBtYXJjX2ZpZWxkXzY1NSRYNjU1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjU1JFg2NTUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCn0NCmZvciAoaSBpbiB4KSB7DQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCnN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0Kc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0Kc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0Kc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KbWFyY19maWVsZF82NTVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTUkWDY1NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjU1JFg2NTUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbGl0ZXJhdHVyYV9CTiA8LSBtZXJnZSh4ID0gbGl0ZXJhdHVyYV9CTiwgeSA9IG1hcmNfZmllbGRfNjU1LCBieS54ID0gImxpY3puaWsiLGFsbC54ID0gVFJVRSkNCmxpdGVyYXR1cmFfQk4gPC0gbGl0ZXJhdHVyYV9CTiAlPiUNCiAgc2VsZWN0KDEsMiwzLDQsWDY1NSA9IDcpDQoNCnR3X2RvX3VzdGFsZW5pYSA8LSBsaXRlcmF0dXJhX0JOICU+JQ0KICBmaWx0ZXIoaXMubmEoVFdfVFdPUkNBX0lEKSkNCg0KZHpfb3NvYl9iZXpfdGVhdHIgPC0gUEJMX2R6X29zb2JfYmV6X3RlYXRydSAlPiUNCiAgc2VsZWN0KDEsMikgJT4lDQogIHVuaXF1ZSgpDQoNCmR6X29zb2JfYmV6X3RlYXRyIDwtIG11dGF0ZShkel9vc29iX2Jlel90ZWF0ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hendhID0gc3Vic3RyKHN0cl9yZXBsYWNlKGR6X29zb2JfYmV6X3RlYXRyJERaX05BWldBLCAiKC4qP1xcKCkoLio/KShcXCkuKiQpIiwiXFwyIiksMSxuY2hhcihzdHJfcmVwbGFjZShkel9vc29iX2Jlel90ZWF0ciREWl9OQVpXQSwgIiguKj9cXCgpKC4qPykoXFwpLiokKSIsIlxcMiIpKS0xKSkNCg0KcmVjem5lIDwtIGRhdGEuZnJhbWUoRFpfRFpJQUxfSUQgPSBjKDY5Nyw2OTcsNjk3LDY5Nyw4MjUsMTAzNywxMTg3LDE0NTQsODg0LDkwMiw1NDQsNTQ0LDU0NCw1NDQpLERaX05BWldBID0gYygiSGFzxYJhIG9zb2Jvd2UgKGJyeXR5anNrYSBpIGlybGFuZHprYSkiLCJIYXPFgmEgb3NvYm93ZSAoYnJ5dHlqc2thIGkgaXJsYW5kemthKSIsIkhhc8WCYSBvc29ib3dlIChicnl0eWpza2EgaSBpcmxhbmR6a2EpIiwiSGFzxYJhIG9zb2Jvd2UgKGJyeXR5anNrYSBpIGlybGFuZHprYSkiLCJIYXPFgmEgb3NvYm93ZSAoZ3JlY2thIHN0YXJvxbx5dG5hKSIsIkhhc8WCYSBvc29ib3dlICjFgmFjacWEc2thIHN0YXJvxbx5dG5hKSIsIkhhc8WCYSBvc29ib3dlIChzeXJ5anNrYSkiLCJIYXPFgmEgb3NvYm93ZSAoZXNwZXJhbnRvKSIsIkhhc8WCYSBvc29ib3dlIChob2xlbmRlcnNrYSkiLCJIYXPFgmEgb3NvYm93ZSAoSW5kaWkpIiwiSGFzxYJhIG9zb2Jvd2UgKEFmcnlraSBTdWJzYWhhcnlqc2tpZWopIiwiSGFzxYJhIG9zb2Jvd2UgKEFmcnlraSBTdWJzYWhhcnlqc2tpZWopIiwiSGFzxYJhIG9zb2Jvd2UgKEFmcnlraSBTdWJzYWhhcnlqc2tpZWopIiwiSGFzxYJhIG9zb2Jvd2UgKEFmcnlraSBTdWJzYWhhcnlqc2tpZWopIiksIHJlZGFrdG9yX2R6aWFsdSA9IGMoIkJFQVRBSyIsIkJFQVRBSyIsIkJFQVRBSyIsIkJFQVRBSyIsIkJFQVRBUyIsIkJFQVRBUyIsIkJFQVRBRCIsIkNFWkFSWSIsIlRPTUFTWlUiLCJFV0EiLCJFV0EiLCJFV0EiLCJFV0EiLCJFV0EiKSwgbmF6d2EgPSBjKCJhbmdpZWxzayIsInN6a29jayIsImlybGFuZHprIiwid2FsaWpzayIsImdyZWNrIiwixYJhY2nFhHNrIiwic3lyeWpzayIsImVzcGVyYW5jayIsIm5pZGVybGFuZHprIiwiaW5keWpzayIsInBvxYJ1ZG5pb3dvYWZyeWthIiwic2VuZWdhbHNrIiwibmlnZXJ5anNrIiwiYWZyeWthxYRzayIpKQ0KcmVjem5lIDwtIHJlY3puZSAlPiUNCiAgc2VsZWN0KDEsMiw0KQ0KZHpfb3NvYl9iZXpfdGVhdHIgPC0gcmJpbmQoZHpfb3NvYl9iZXpfdGVhdHIscmVjem5lKQ0KZHpfb3NvYl9iZXpfdGVhdHIkbmF6d2FbZHpfb3NvYl9iZXpfdGVhdHIkbmF6d2E9PSJsaXRlcmF0dXJhIHBvbHNrIl0gPC0gInBvbHNrIg0KDQpsaXRlcmF0dXJhX2R6IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdHdfZG9fdXN0YWxlbmlhIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gZHpfb3NvYl9iZXpfdGVhdHIgYiBvbiBhLlg2NTUgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikNCg0KbGl0ZXJhdHVyYV9keiA8LSBsaXRlcmF0dXJhX2R6W29yZGVyKGxpdGVyYXR1cmFfZHokbGljem5payxsaXRlcmF0dXJhX2R6JFRXX05BWldJU0tPLGxpdGVyYXR1cmFfZHokVFdfSU1JRSxsaXRlcmF0dXJhX2R6JERaX0RaSUFMX0lEKSxdDQpsaXRlcmF0dXJhX2R6ICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gbGl0ZXJhdHVyYV9keiRzYW1lDQpsaXRlcmF0dXJhX2R6JHNhbWVbMV0gPC0gMA0KbGl0ZXJhdHVyYV9keiA8LSBsaXRlcmF0dXJhX2R6ICU+JQ0KICBmaWx0ZXIoc2FtZT09MCkgJT4lDQogIHNlbGVjdCgtbGVuZ3RoKGxpdGVyYXR1cmFfZHopKQ0KdGVzdCA8LSBtdXRhdGUoQk5fUEJMX3R3b3JjYSwNCiAgICAgICAgICAgICAgIHBvbGFjem9uZSA9IHBhc3RlKEJOX1BCTF90d29yY2EkVFdfVFdPUkNBX0lELEJOX1BCTF90d29yY2EkbGljem5payxCTl9QQkxfdHdvcmNhJFRXX05BWldJU0tPLEJOX1BCTF90d29yY2EkVFdfSU1JRSxzZXAgPSAifCIpKQ0KbGl0ZXJhdHVyYV9keiA8LSBtdXRhdGUobGl0ZXJhdHVyYV9keiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGFjem9uZSA9IHBhc3RlKGxpdGVyYXR1cmFfZHokVFdfVFdPUkNBX0lELGxpdGVyYXR1cmFfZHokbGljem5payxsaXRlcmF0dXJhX2R6JFRXX05BWldJU0tPLGxpdGVyYXR1cmFfZHokVFdfSU1JRSxzZXAgPSAifCIpKQ0KDQp0ZXN0IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGVzdCBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIGxpdGVyYXR1cmFfZHogYiBvbiBhLnBvbGFjem9uZT1iLnBvbGFjem9uZSIpDQoNCnRlc3QkVFdfRFpfRFpJQUxfSUQgPC0gaWZlbHNlKGlzLm5hKHRlc3QkVFdfVFdPUkNBX0lEKSwgdGVzdCREWl9EWklBTF9JRCx0ZXN0JFRXX0RaX0RaSUFMX0lEKQ0KdGVzdCREWl9OQVpXQSA8LSBpZmVsc2UoaXMubmEodGVzdCRUV19UV09SQ0FfSUQpLCB0ZXN0JERaX05BWldBLi4xNCwgdGVzdCREWl9OQVpXQSkNCkJOX1BCTF90d29yY2FfZnVsbCA8LSB0ZXN0ICU+JQ0KICBmaWx0ZXIoIWlzLm5hKFRXX0RaX0RaSUFMX0lEKSkgJT4lDQogIHNlbGVjdCgxOjE2KQ0KdGVzdCA8LSB0ZXN0ICU+JQ0KICBmaWx0ZXIoaXMubmEoVFdfRFpfRFpJQUxfSUQpKSAlPiUNCiAgc2VsZWN0KDE6MTYpDQoNCmR6X25hendhX2Z1bGwgPC0gQk5fUEJMX3R3b3JjYV9mdWxsICU+JQ0KICBzZWxlY3QoVFdfVFdPUkNBX0lELGxpY3puaWssRFpfTkFaV0EsIFRXX0RaX0RaSUFMX0lELCB0d19pbWllPVRXX0lNSUUsIHR3X25hendpc2tvPVRXX05BWldJU0tPKQ0KZHpfbmF6d2FfZnVsbCA8LSBkel9uYXp3YV9mdWxsW29yZGVyKGR6X25hendhX2Z1bGwkbGljem5payksXQ0KDQpkel9uYXp3YSA8LSBkel9uYXp3YV9mdWxsICU+JQ0KICBzZWxlY3QobGljem5paywgRFpfTkFaV0EpDQojMTMNCmR6X2R6aWFsX2lkIDwtIGR6X25hendhX2Z1bGwgJT4lDQogIHNlbGVjdChsaWN6bmlrLCBEWl9EWklBTF9JRD1UV19EWl9EWklBTF9JRCkNCiMxNA0KbWFyY19maWVsZCA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5payxYMjQ1KSMlPiUNCm1hcmNfZmllbGQkWDI0NTwtc3RyX3JlbW92ZV9hbGwobWFyY19maWVsZCRYMjQ1LCJeXFx8IikNCm1hcmNfZmllbGQgPC0gbXV0YXRlKG1hcmNfZmllbGQsDQogICAgICAgICAgICAgICBpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwobWFyY19maWVsZCRYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQoNCm1hcmNfZmllbGQ8LWNiaW5kKG1hcmNfZmllbGQsZW1wdHlfdGFibGUpDQoNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQoNCmZvciAoaSBpbiB4KSB7DQogIG1hcmNfZmllbGQkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkJFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCn0NCmZvciAoaSBpbiB4KSB7DQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCnN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0Kc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0Kc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0Kc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KbWFyY19maWVsZFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkJFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkJFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCnByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgIA0KfQ0KbWFyY19maWVsZCRgJGFgW2lzLm5hKG1hcmNfZmllbGQkYCRhYCldIDwtICIiDQp6YV90eXR1bCA8LSBkYXRhLmZyYW1lKHR5dHVsX2JuID0gcGFzdGUobWFyY19maWVsZCRgJGFgLG1hcmNfZmllbGQkYCRiYCxzZXAgPSAiIiksIGxpY3puaWsgPSBtYXJjX2ZpZWxkJGxpY3puaWspDQp6YV90eXR1bCR0eXR1bF9ibiA8LSBzdHJfcmVtb3ZlKHphX3R5dHVsJHR5dHVsX2JuLCAiXFxzK1xcLyQiKQ0KemFfdHl0dWwgPC0gbXV0YXRlKHphX3R5dHVsLA0KICAgICAgICAgICAgICAgICAgIHR5dHVsID0gZ3N1YigiKFthLXrEmcOzxIXFm8WCxbzFusSHxYRdKSggKSg6KSggezAsMX0pKFxcKHswLDF9KShbYS16xJnDs8SFxZvFgsW8xbrEh8WEQS1axJjDk8SExZrFgcW7xbnEhsWDXSkoLikiLCJcXDEuXFwyXFxVXFw1XFw2XFxFXFw3IixwZXJsID0gVFJVRSwgemFfdHl0dWwkdHl0dWxfYm4pKQ0KemFfdHl0dWwkdHl0dWwgPC0gZ3N1YigiKCApKDopKCB7MCwxfVthLXpdKSguKSIsIlxcMVxcVVxcM1xcRVxcNCIscGVybCA9IFRSVUUsIHphX3R5dHVsJHR5dHVsKQ0KemFfdHl0dWwkdHl0dWwgPC0gc3RyX3JlcGxhY2UoemFfdHl0dWwkdHl0dWwsICIoW15cXC5dKShcXC4kKSIsIlxcMSIpDQp6YV90eXR1bCA8LSB6YV90eXR1bCAlPiUNCiAgc2VsZWN0KDIsMykNCnphX3R5dHVsX2NvcHkgPC0gemFfdHl0dWwNCg0KbGlzdGFfZ2F0X3BibCA8LSBkYXRhLmZyYW1lKGdhdHVuZWsgPSBjKCJhZm9yeXptIiwiYWxidW0iLCJhbnRvbG9naWEiLCJhdXRvYmlvZ3JhZmlhIiwiZHppZW5uaWsiLCJlc2VqIiwiZmVsaWV0b24iLCJpbm5lIiwia2F6YW5pZSIsImxpc3QiLCJtaW5pYXR1cmEgcHJvesSFIiwib3Bvd2lhZGFuaWUiLCJwb2VtYXQiLCJwb3dpZcWbxIciLCJwcm96YSIsInByb3phIHBvZXR5Y2thIiwicmVwb3J0YcW8Iiwicm96bXnFm2xhbmllIHJlbGlnaWpuZSIsInJ5c3VuZWssIG9icmF6Iiwic2NlbmFyaXVzeiIsInN6a2ljIiwidGVrc3QgYmlibGlqbnkiLCJ0ZWtzdCBkcmFtYXR5Y3pueSIsIndpZXJzeiIsIndzcG9tbmllbmllIiwid3lwb3dpZWTFuiIpKQ0KDQp0ZXN0IDwtIGRhdGEgJT4lDQogIHNlbGVjdChsaWN6bmlrLFg2NTUsWDY1MCkNCnRlc3QyIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICBmcm9tIHRlc3QNCiAgICAgICAgICAgICAgbGVmdCBqb2luIGxpc3RhX2dhdF9wYmwgb24gbG93ZXIodGVzdC5YNjUwKSBsaWtlICclJ3x8bGlzdGFfZ2F0X3BibC5nYXR1bmVrfHwnJSciKQ0KdGVzdCA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgZnJvbSB0ZXN0DQogICAgICAgICAgICAgIGxlZnQgam9pbiBsaXN0YV9nYXRfcGJsIG9uIGxvd2VyKHRlc3QuWDY1NSkgbGlrZSAnJSd8fGxpc3RhX2dhdF9wYmwuZ2F0dW5la3x8JyUnIikNCnRlc3QgPC0gdGVzdCAlPiUNCiAgc2VsZWN0KGxpY3puaWssZ2F0dW5laykNCnRlc3QyIDwtIHRlc3QyICU+JQ0KICBzZWxlY3QobGljem5payxnYXR1bmVrKQ0KdGVzdCA8LSByYmluZCh0ZXN0LHRlc3QyKQ0KdGVzdCA8LSB0ZXN0ICU+JQ0KICB1bmlxdWUoKQ0KICANCnRlc3QgPC0gdGVzdFtvcmRlcih0ZXN0JGxpY3puaWssdGVzdCRnYXR1bmVrKSxdDQp0ZXN0ICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gdGVzdCRzYW1lDQp0ZXN0JHNhbWVbMV0gPC0gMA0KdGVzdCA8LSB0ZXN0ICU+JQ0KICBmaWx0ZXIoc2FtZT09MCkgJT4lDQogIHNlbGVjdCgtbGVuZ3RoKHRlc3QpKQ0KDQp6YV90eXR1bCA8LSBtZXJnZSh4PXphX3R5dHVsLHk9dGVzdCwgYnkgPSAibGljem5payIsIGFsbC54ID0gVFJVRSkNCnphX3R5dHVsJHR5dHVsIDwtIGlmZWxzZSghaXMubmEoemFfdHl0dWwkZ2F0dW5laykscGFzdGUoemFfdHl0dWwkdHl0dWwsIi4gWyIsZ3N1YigiKF4uKSIsIlxcVVxcMSIscGVybCA9IFRSVUUsIHphX3R5dHVsJGdhdHVuZWspLCJdIixzZXAgPSAiIiksemFfdHl0dWwkdHl0dWwpDQojMTUNCm1hcmNfZmllbGQgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KGxpY3puaWssWDI0NikNCm1hcmNfZmllbGQkWDI0NiA8LSBzdHJfcmVwbGFjZV9hbGwobWFyY19maWVsZCRYMjQ2LCIoXnxcXHwpIiwiflxcMSIpDQptYXJjX2ZpZWxkIDwtIGNTcGxpdChtYXJjX2ZpZWxkLCJYMjQ2IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKQ0KbWFyY19maWVsZCRYMjQ2PC1zdHJfcmVtb3ZlX2FsbChtYXJjX2ZpZWxkJFgyNDYsIl5cXHwiKQ0KbWFyY19maWVsZCA8LSBtdXRhdGUobWFyY19maWVsZCwNCiAgICAgICAgICAgICAgIGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChtYXJjX2ZpZWxkJFgyNDYsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ2LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGQpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCg0KbWFyY19maWVsZDwtY2JpbmQobWFyY19maWVsZCxlbXB0eV90YWJsZSkNCg0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgbWFyY19maWVsZCRYMjQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGQkWDI0NixzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KfQ0KZm9yIChpIGluIHgpIHsNCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0Kc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQpzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQpzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQpzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQptYXJjX2ZpZWxkWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGQkWDI0Niksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGQkWDI0NiksIlxcJHsyfS4iLCAifiIpLE5BKQ0KcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSAgDQp9DQpjb2xuYW1lcyhtYXJjX2ZpZWxkKVs3XSA8LSAiaW5uYSINCm1hcmNfZmllbGQkYCRhYFtpcy5uYShtYXJjX2ZpZWxkJGAkYWApXSA8LSAiIg0KbWFyY19maWVsZCRgJGJgW2lzLm5hKG1hcmNfZmllbGQkYCRiYCldIDwtICIiDQp6YV90eXR1bF9vcnlnaW5hbHUgPC0gbWFyY19maWVsZCAlPiUNCiAgc2VsZWN0KGxpY3puaWssYCRhYCxgJGJgLGAkaWApDQp6YV90eXR1bF9vcnlnaW5hbHUgPC0gbXV0YXRlKHphX3R5dHVsX29yeWdpbmFsdSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHl0dWwgPSBpZmVsc2UoZ3JlcGwoInl0XFwuezAsMX0gb3J5Z3x5dFxcLnswLDF9b3J5Z3x5dFxcLnswLDF9IG9yZ3x5dHVbbMWCXSBvcnlnaW5hIix6YV90eXR1bF9vcnlnaW5hbHUkYCRpYCkscGFzdGUoemFfdHl0dWxfb3J5Z2luYWx1JGAkYWAsemFfdHl0dWxfb3J5Z2luYWx1JGAkYmAsc2VwID0gIiIpLE5BKSkNCg0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIHphX3R5dHVsX29yeWdpbmFsdVtvcmRlcih6YV90eXR1bF9vcnlnaW5hbHUkbGljem5payx6YV90eXR1bF9vcnlnaW5hbHUkdHl0dWwpLF0NCnphX3R5dHVsX29yeWdpbmFsdSAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpIH0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IHphX3R5dHVsX29yeWdpbmFsdSRzYW1lDQp6YV90eXR1bF9vcnlnaW5hbHUkc2FtZVsxXSA8LSAwDQp6YV90eXR1bF9vcnlnaW5hbHUgPC0gemFfdHl0dWxfb3J5Z2luYWx1ICU+JQ0KICBmaWx0ZXIoc2FtZT09MCkgJT4lDQogIHNlbGVjdCgtbGVuZ3RoKHphX3R5dHVsX29yeWdpbmFsdSkpDQp6YV90eXR1bF9vcnlnaW5hbHUgPC0gemFfdHl0dWxfb3J5Z2luYWx1ICU+JQ0KICBzZWxlY3QoMSw1KQ0KDQp6YV90eXR1bF9vcnlnaW5hbHUkdHl0dWwgPC0gZ3N1YigiKFthLXrEmcOzxIXFm8WCxbzFusSHxYRdKSggKSg6KSggezAsMX0pKFxcKHswLDF9KShbYS16xJnDs8SFxZvFgsW8xbrEh8WEQS1axJjDk8SExZrFgcW7xbnEhsWDXSkoLikiLCJcXDEuXFwyXFxVXFw1XFw2XFxFXFw3IixwZXJsID0gVFJVRSwgemFfdHl0dWxfb3J5Z2luYWx1JHR5dHVsKQ0KemFfdHl0dWxfb3J5Z2luYWx1JHR5dHVsIDwtIGdzdWIoIiggKSg6KSggezAsMX1bYS16XSkoLikiLCJcXDFcXFVcXDNcXEVcXDQiLHBlcmwgPSBUUlVFLCB6YV90eXR1bF9vcnlnaW5hbHUkdHl0dWwpDQp6YV90eXR1bF9vcnlnaW5hbHUkdHl0dWwgPC0gc3RyX3JlcGxhY2UoemFfdHl0dWxfb3J5Z2luYWx1JHR5dHVsLCAiKFteXFwuXSkoXFwuJCkiLCJcXDEiKQ0KIzE2DQptYXJjX2ZpZWxkIDwtIGRhdGEgJT4lDQogIHNlbGVjdChsaWN6bmlrLFgwNDEpDQptYXJjX2ZpZWxkJFgwNDE8LXN0cl9yZW1vdmVfYWxsKG1hcmNfZmllbGQkWDA0MSwiXlxcfCIpDQptYXJjX2ZpZWxkIDwtIG11dGF0ZShtYXJjX2ZpZWxkLA0KICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKG1hcmNfZmllbGQkWDA0MSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgwNDEsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KDQptYXJjX2ZpZWxkPC1jYmluZChtYXJjX2ZpZWxkLGVtcHR5X3RhYmxlKQ0KDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KDQpmb3IgKGkgaW4geCkgew0KICBtYXJjX2ZpZWxkJFgwNDEgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZCRYMDQxLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQp9DQpmb3IgKGkgaW4geCkgew0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQpzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCnN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCnN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCnN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCm1hcmNfZmllbGRbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZCRYMDQxKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZCRYMDQxKSwiXFwkezJ9LiIsICJ+IiksTkEpDQpwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpICANCn0NCnphX2plenlrX29yeWdpbmFsdSA8LSBtYXJjX2ZpZWxkICU+JQ0KICBzZWxlY3QobGljem5payxqZXp5a19vcnlnaW5hbHUgPSBgJGFgKQ0KemFfamV6eWtfb3J5Z2luYWx1JGplenlrX29yeWdpbmFsdSA8LSBzdHJfcmVwbGFjZV9hbGwoemFfamV6eWtfb3J5Z2luYWx1JGplenlrX29yeWdpbmFsdSwiXFwkYSIsInwiKQ0KIzE3DQpCTl93c3BvbHR3b3JjYSA8LSBkYXRhLmZyYW1lKHdzcG9sdHdvcmNhID0gc3RyX3JlbW92ZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIig/PD07ICkoLiopKD89JCkiKSksIlxcLiQiKSwgbGljem5payA9IGRhdGEkbGljem5paykNCkJOX3dzcG9sdHdvcmNhJHdzcG9sdHdvcmNhIDwtIHN0cl9yZW1vdmVfYWxsKEJOX3dzcG9sdHdvcmNhJHdzcG9sdHdvcmNhLCIgZXQgYWxcXC4iKQ0KQk5fd3Nwb2x0d29yY2EgPC0gbXV0YXRlKEJOX3dzcG9sdHdvcmNhLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmtjamEgPSBhcy5jaGFyYWN0ZXIoc3RyX2V4dHJhY3RfYWxsKEJOX3dzcG9sdHdvcmNhJHdzcG9sdHdvcmNhLCIoPzw9XFxbKSguKj8pKD89IFtBLVrDk8WaxYHFu8W5xIbFg10pIikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG9zX2ltaWUgPSBhcy5jaGFyYWN0ZXIoc3RyX2V4dHJhY3RfYWxsKEJOX3dzcG9sdHdvcmNhJHdzcG9sdHdvcmNhLCIoPzw9ICkoLiopKD89ICg/IS4qICkpIikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG9zX25hendpc2tvID0gc3RyX3JlcGxhY2VfYWxsKEJOX3dzcG9sdHdvcmNhJHdzcG9sdHdvcmNhLCIoLiopKCAoPyEuKiApKSguKikoXFxdKSIsICJcXDMiKSkNCg0Kd3NfcHJvc3R5IDwtIHBhc3RlKEJOX3dzcG9sdHdvcmNhJG9zX25hendpc2tvLEJOX3dzcG9sdHdvcmNhJG9zX2ltaWUpDQp3c19wcm9zdHkgPC0gdW5saXN0KHdzX3Byb3N0eSkNCndzX3Byb3N0eSA8LSBzdHJfdG9fbG93ZXIod3NfcHJvc3R5KQ0Kd3NfcHJvc3R5IDwtIHN0cl9yZXBsYWNlX2FsbCh3c19wcm9zdHksICJcXFciLCAiIikNCndzX3Byb3N0eSA8LSBsaXN0KHdzX3Byb3N0eSkNCndzX3Byb3N0eSA8LSBkYXRhLmZyYW1lKHdzX3Byb3N0eSkNCmNvbG5hbWVzKHdzX3Byb3N0eSkgPC0gIm5hendhIg0KDQpmdV9wcm9zdGEgPC0gQk5fd3Nwb2x0d29yY2EkZnVua2NqYQ0KZnVfcHJvc3RhIDwtIHVubGlzdChmdV9wcm9zdGEpDQpmdV9wcm9zdGEgPC0gc3RyX3RvX2xvd2VyKGZ1X3Byb3N0YSkNCmZ1X3Byb3N0YSA8LSBzdHJfcmVwbGFjZV9hbGwoZnVfcHJvc3RhLCAiXFxXIiwgIiIpDQpmdV9wcm9zdGEgPC0gbGlzdChmdV9wcm9zdGEpDQpmdV9wcm9zdGEgPC0gZGF0YS5mcmFtZShmdV9wcm9zdGEpDQpjb2xuYW1lcyhmdV9wcm9zdGEpIDwtICJuYXp3YSINCg0Kd3NfQk4gPC0gZGF0YS5mcmFtZShsaWN6bmlrID0gQk5fd3Nwb2x0d29yY2EkbGljem5paywgb3NfbmF6d2lza28gPSBCTl93c3BvbHR3b3JjYSRvc19uYXp3aXNrbywgb3NfaW1pZSA9IEJOX3dzcG9sdHdvcmNhJG9zX2ltaWUsIG5hendhX3Byb3N0YSA9IHdzX3Byb3N0eSRuYXp3YSwgZnVua2NqYSA9IEJOX3dzcG9sdHdvcmNhJGZ1bmtjamEsIG5hendhID0gZnVfcHJvc3RhJG5hendhKQ0KDQpCTl9QQkxfd3Nwb2x0d29yY3kgPC0gbWVyZ2UoeCA9IHdzX0JOLCB5ID0gUEJMX3dzcG9sdHdvcmN5LCBieSA9ICduYXp3YV9wcm9zdGEnLCBzb3J0ID0gRkFMU0UsIGFsbC54ID0gVFJVRSkNCg0KQk5fUEJMX3dzcG9sdHdvcmN5IDwtIG1lcmdlKHggPSBCTl9QQkxfd3Nwb2x0d29yY3ksIHkgPSBQQkxfZnVua2NqZSwgYnkgPSAnbmF6d2EnLCBzb3J0ID0gRkFMU0UsIGFsbC54ID0gVFJVRSkNCg0KQk5fUEJMX3dzcG9sdHdvcmN5IDwtIEJOX1BCTF93c3BvbHR3b3JjeVtvcmRlcihhcy5pbnRlZ2VyKGFzLmNoYXJhY3RlcihCTl9QQkxfd3Nwb2x0d29yY3kkbGljem5paykpKSxdDQoNCiNuYXp3aXNrbw0KDQpiX29zX25hendpc2tvIDwtIGRhdGEuZnJhbWUob3NfbmF6d2lza28gPSBpZmVsc2UoaXMubmEoQk5fUEJMX3dzcG9sdHdvcmN5JE9TX09TT0JBX0lEKSwgYXMuY2hhcmFjdGVyKEJOX1BCTF93c3BvbHR3b3JjeSRvc19uYXp3aXNrbyksIE5BKSkNCmJfb3NfaW1pZSA8LSBkYXRhLmZyYW1lKG9zX2ltaWUgPSBpZmVsc2UoaXMubmEoQk5fUEJMX3dzcG9sdHdvcmN5JE9TX09TT0JBX0lEKSwgYXMuY2hhcmFjdGVyKEJOX1BCTF93c3BvbHR3b3JjeSRvc19pbWllKSwgTkEpKQ0KDQpCTl9QQkxfb3NvYnlfZnVua2NqZSA8LSBkYXRhLmZyYW1lKGxpY3puaWsgPSBCTl9QQkxfd3Nwb2x0d29yY3kkbGljem5paywgb3Nfb3NvYmFfaWQgPSBCTl9QQkxfd3Nwb2x0d29yY3kkT1NfT1NPQkFfSUQsIGJfb3NfbmF6d2lza28sIGJfb3NfaW1pZSwgZm9fc3ltYm9sID0gQk5fUEJMX3dzcG9sdHdvcmN5JGZvX3N5bWJvbCwgZm9fbmF6d2EgPSBCTl9QQkxfd3Nwb2x0d29yY3kkZm9fbmF6d2EgKQ0KDQojMjINCnphX29waXNfd3Nwb2x0d29yY293IDwtIGRhdGEuZnJhbWUoemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBnc3ViKCIoXFxbKSguKSguKikiLCAiXFwxXFxVXFwyXFxFXFwzIiwgcGVybCA9IFRSVUUsIEJOX3dzcG9sdHdvcmNhJHdzcG9sdHdvcmNhKSwgbGljem5payA9IGRhdGEkbGljem5paykNCg0KIzIzDQp6YV93eWRhbmllIDwtIGRhdGEuZnJhbWUoZGF0YSRYMjUwKQ0KemFfd3lkYW5pZSA8LSBkYXRhLmZyYW1lKHN0cl9yZXBsYWNlX2FsbCh6YV93eWRhbmllWywxXSwgIlxcJGFXeWRcXC4gIiwiIikpDQp6YV93eWRhbmllIDwtIGRhdGEuZnJhbWUoc3RyX3JlcGxhY2VfYWxsKHphX3d5ZGFuaWVbLDFdLCAiLlxcJC4qIiwiIikpDQp6YV93eWRhbmllIDwtIGRhdGEuZnJhbWUoc3RyX3JlcGxhY2VfYWxsKHphX3d5ZGFuaWVbLDFdLCAiKFxcZCkoXFwuJCkiLCJcXDEiKSkNCnphX3d5ZGFuaWUgPC0gY2JpbmQoemFfd3lkYW5pZSwgMTpsZW5ndGhzKHphX3d5ZGFuaWUpKQ0KY29sbmFtZXMoemFfd3lkYW5pZSkgPC0gYygiemFfd3lkYW5pZSIsICJsaWN6bmlrIikNCiMyNA0KbWFyY19maWVsZCA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5payxYMjQ1KQ0KbWFyY19maWVsZCRYMjQ1PC1zdHJfcmVwbGFjZV9hbGwobWFyY19maWVsZCRYMjQ1LCIoXnxcXHwpIiwiflxcMSIpDQptYXJjX2ZpZWxkPC0gY1NwbGl0KG1hcmNfZmllbGQsIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpDQptYXJjX2ZpZWxkPC0gbWFyY19maWVsZCU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpDQptYXJjX2ZpZWxkJFgyNDU8LXN0cl9yZW1vdmVfYWxsKG1hcmNfZmllbGQkWDI0NSwiXlxcfCIpDQptYXJjX2ZpZWxkIDwtIG11dGF0ZShtYXJjX2ZpZWxkLA0KICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKG1hcmNfZmllbGQkWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KDQptYXJjX2ZpZWxkPC1jYmluZChtYXJjX2ZpZWxkLGVtcHR5X3RhYmxlKQ0KDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KDQpmb3IgKGkgaW4geCkgew0KICBtYXJjX2ZpZWxkJFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZCRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQp9DQpmb3IgKGkgaW4geCkgew0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQpzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCnN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCnN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCnN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCm1hcmNfZmllbGRbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZCRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZCRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQpwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpICANCn0NCg0KemFfaW5zdHl0dWNqYSA8LSBtYXJjX2ZpZWxkICU+JQ0KICBzZWxlY3QobGljem5paywgWDI0NSA9IGAkY2ApDQoNCnphX2luc3R5dHVjamEgPC0gemFfaW5zdHl0dWNqYVtvcmRlcih6YV9pbnN0eXR1Y2phJGxpY3puaWssemFfaW5zdHl0dWNqYSRYMjQ1KSxdDQp6YV9pbnN0eXR1Y2phICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gemFfaW5zdHl0dWNqYSRzYW1lDQp6YV9pbnN0eXR1Y2phJHNhbWVbMV0gPC0gMA0KemFfaW5zdHl0dWNqYSA8LSB6YV9pbnN0eXR1Y2phICU+JQ0KICBmaWx0ZXIoc2FtZT09MCkgJT4lDQogIHNlbGVjdCgtbGVuZ3RoKHphX2luc3R5dHVjamEpKQ0KDQp6YV9pbnN0eXR1Y2phIDwtIG11dGF0ZSh6YV9pbnN0eXR1Y2phLA0KICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7Iix6YV9pbnN0eXR1Y2phJFgyNDUpLHN0cl9yZXBsYWNlX2FsbCh6YV9pbnN0eXR1Y2phJFgyNDUsICIoLio/KShcXDsoPyEuKlxcOykpKCApKyguKj8kKSIsIlxcNCIpLCIiKSkNCg0KemFfaW5zdHl0dWNqYSA8LSBtZXJnZSh4PXphX2luc3R5dHVjamEseT1CTl9QQkxfd3Nwb2x0d29yY3ksYnkgPSAibGljem5payIsYWxsLnggPSBUUlVFKQ0KemFfaW5zdHl0dWNqYSA8LSB6YV9pbnN0eXR1Y2phICU+JQ0KICBzZWxlY3QoMSwyLDMsNiw3KQ0KemFfaW5zdHl0dWNqYSA8LSBtdXRhdGUoemFfaW5zdHl0dWNqYSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGN6eV9uYXogPSBzdHJfZGV0ZWN0KHphX2luc3R5dHVjamEkWDI0NSxhcy5jaGFyYWN0ZXIoemFfaW5zdHl0dWNqYSRvc19uYXp3aXNrbykpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY3p5X2ltID0gc3RyX2RldGVjdCh6YV9pbnN0eXR1Y2phJFgyNDUsYXMuY2hhcmFjdGVyKHphX2luc3R5dHVjamEkb3NfaW1pZSkpKQ0KdGVzdCA8LSB6YV9pbnN0eXR1Y2phICU+JQ0KICBmaWx0ZXIoaXMubmEoY3p5X25heikmaXMubmEoY3p5X2ltKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighKGdyZXBsKCJeXFxbW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XlthLXrEmcOzxIXFm8WCxbzFusSHxYRdIixpbnN0eXR1Y2phKSkpICU+JQ0KICBzZWxlY3QobGljem5payxpbnN0eXR1Y2phKQ0KdGVzdCRpbnN0eXR1Y2phIDwtIHN0cl9yZW1vdmUodGVzdCRpbnN0eXR1Y2phLCIoPzw9W2EtesSZw7PEhcWbxYLFvMW6xIfFhF0pKFxcLiQpIikNCnphX2luc3R5dHVjamEgPC0gdGVzdA0KdGVzdCA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5paykNCnphX2luc3R5dHVjamEgPC0gbWVyZ2UoeD16YV9pbnN0eXR1Y2phLHk9dGVzdCxieSA9ICJsaWN6bmlrIiwgYWxsID0gVFJVRSkNCiMyNQ0KQk5fd3lkYXduaWN0d28gPC0gZGF0YS5mcmFtZShYMjYwID0gZGF0YSRYMjYwLCBsaWN6bmlrID0gZGF0YSRsaWN6bmlrKQ0KQk5fd3lkYXduaWN0d28kWDI2MCA8LSBzdHJfcmVwbGFjZV9hbGwoQk5fd3lkYXduaWN0d28kWDI2MCwic1xcLm5cXC4iLCAiYi53LiIpDQpCTl93eWRhd25pY3R3byRYMjYwIDwtIHN0cl9yZXBsYWNlX2FsbChCTl93eWRhd25pY3R3byRYMjYwLCJzXFwubFxcLiIsICJiLm0uIikNCkJOX3d5ZGF3bmljdHdvJFgyNjAgPC0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJFgyNjAsIlNcXC5sXFwuIiwgImIubS4iKQ0KQk5fd3lkYXduaWN0d28kWDI2MCA8LSBzdHJfcmVwbGFjZV9hbGwoQk5fd3lkYXduaWN0d28kWDI2MCwiXFwkZiIsICIkYyIpDQpCTl93eWRhd25pY3R3byRYMjYwIDwtIHN0cl9yZW1vdmUoQk5fd3lkYXduaWN0d28kWDI2MCwiXlxcXFwrIikNCiNyxJljem5pZSB3eWdlbmVyb3dhxIcgaSBuYXByYXdpxIcgYsWCxIVkICI6JGEiIC0gcG93aW5ubyBiecSHIGFsYm8gOyRhLCBhbGJvIDokYg0KdGVzdCA8LSBtdXRhdGUoQk5fd3lkYXduaWN0d28sDQogICAgICAgICAgICAgICBkd3VrID0gc3RyX2RldGVjdChCTl93eWRhd25pY3R3byRYMjYwLCJcXDpcXCRhIikpDQp0ZXN0IDwtIHRlc3QgJT4lDQogIGZpbHRlcihkd3VrPT1UUlVFKQ0KI0JOX3d5ZGF3bmljdHdvJFgyNjBbQk5fd3lkYXduaWN0d28kWDI2MD09IiRhS3Jha8OzdyA6JGJDb2xsZWdpdW0gQ29sdW1iaW51bSA7JGFXYXJzemF3YSA6JGFUb3dhcnp5c3R3byBCYWRhxYQgbmFkIFdpZWtpZW0gT3NpZW1uYXN0eW0sJGNjb3AuIDIwMDYuIl0gPC0gIiRhS3Jha8OzdyA6JGJDb2xsZWdpdW0gQ29sdW1iaW51bSA7JGFXYXJzemF3YSA6JGJUb3dhcnp5c3R3byBCYWRhxYQgbmFkIFdpZWtpZW0gT3NpZW1uYXN0eW0sJGNjb3AuIDIwMDYuIg0KDQpCTl93eWRhd25pY3R3byA8LSBtdXRhdGUoQk5fd3lkYXduaWN0d28sDQogICAgICAgICAgICAgICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoQk5fd3lkYXduaWN0d28kWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwNCiAgICAgICAgICAgICAgICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChCTl93eWRhd25pY3R3byRYMjYwLCAiLlxcJGMuKiIsICIiKSkNCg0KQk5fd3lkYXduaWN0d28kYmV6X3Jva3UgPC0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCAiO1xcJGIiLCAiOiRiIikNCkJOX3d5ZGF3bmljdHdvIDwtIG11dGF0ZShCTl93eWRhd25pY3R3bywNCiAgICAgICAgICAgICAgICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgICAgICAgICAgICAgICBpbGVfbWllanNjID0gc3RyX2NvdW50KEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCAiXFwkYSIpLA0KICAgICAgICAgICAgICAgICAgICAgIGtvbGVqbm9zYyA9IHN0cl9yZW1vdmUoc3RyX3JlcGxhY2VfYWxsKGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsICJcXCQuIikpLCAiW15hLXpdIiwgIiIpLCJeYyIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBvZHppZWxvbmUgPSBzdHJfcmVwbGFjZV9hbGwoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsIihcXCQuKSIsInxcXDF+IikpDQoNCkJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUgPC0gc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byRwb2R6aWVsb25lLCJeXFx8IikNCkJOX3d5ZGF3bmljdHdvJGtvbGVqbm9zYyA8LSBzdHJfcmVwbGFjZV9hbGwoQk5fd3lkYXduaWN0d28ka29sZWpub3NjLCIoLikiLCJcXDF8IikNCkJOX3d5ZGF3bmljdHdvJGtvbGVqbm9zYyA8LSBzdHJfcmVtb3ZlKEJOX3d5ZGF3bmljdHdvJGtvbGVqbm9zYywiXFx8JCIpDQpCTl93eWRhd25pY3R3byA8LSBjU3BsaXQoQk5fd3lkYXduaWN0d28sYygia29sZWpub3NjIiwicG9kemllbG9uZSIpLCBzZXAgPSAifCIsIGRpcmVjdGlvbiA9ICJsb25nIikNCg0KQk5fd3lkYXduaWN0d28gJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSAmIGtvbGVqbm9zYyA9PSBkcGx5cjo6bGFnKGtvbGVqbm9zYywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gQk5fd3lkYXduaWN0d28kc2FtZQ0KQk5fd3lkYXduaWN0d28kc2FtZVsxXSA8LSAwDQpCTl93eWRhd25pY3R3byRyb2tfd3lkYW5pYSA8LSBhcy5jaGFyYWN0ZXIoQk5fd3lkYXduaWN0d28kcm9rX3d5ZGFuaWEpDQpCTl93eWRhd25pY3R3byRscCA8LSAxOmxlbmd0aHMoQk5fd3lkYXduaWN0d28pDQpwaWVyd3N6ZSA8LSBCTl93eWRhd25pY3R3byAlPiUNCiAgZmlsdGVyKHNhbWU9PTApDQpkcnVnaWUgPC0gQk5fd3lkYXduaWN0d28gJT4lDQogIGZpbHRlcihzYW1lPT0xKQ0KZHJ1Z2llIDwtIGRkcGx5KGRydWdpZSwgLihYMjYwLCBsaWN6bmlrLCByb2tfd3lkYW5pYSwgYmV6X3Jva3UsIGlsZV93eWRhd25pY3R3LCBpbGVfbWllanNjLCBrb2xlam5vc2MsIHNhbWUpLCBzdW1tYXJpemUsIHBvZHppZWxvbmUgPSBwYXN0ZShwb2R6aWVsb25lLCBjb2xsYXBzZT0iIiksIGxwID0gcGFzdGUobHAsIGNvbGxhcHNlPSJ8IikpDQpCTl93eWRhd25pY3R3byA8LSByYmluZChwaWVyd3N6ZSxkcnVnaWUpDQpCTl93eWRhd25pY3R3byRscCA8LSBzdHJfcmVwbGFjZShCTl93eWRhd25pY3R3byRscCwiKC4qPykoXFx8KSguKiQpIiwiXFwxIikNCkJOX3d5ZGF3bmljdHdvJGxwIDwtIGFzLmludGVnZXIoQk5fd3lkYXduaWN0d28kbHApDQpCTl93eWRhd25pY3R3byA8LSBCTl93eWRhd25pY3R3b1tvcmRlcihCTl93eWRhd25pY3R3byRsaWN6bmlrLEJOX3d5ZGF3bmljdHdvJGxwKSxdDQpCTl93eWRhd25pY3R3byA8LSBCTl93eWRhd25pY3R3byAlPiUNCiAgc2VsZWN0KC1scCkNCkJOX3d5ZGF3bmljdHdvICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgJiBrb2xlam5vc2MgPT0gImIiICYga29sZWpub3NjID09IGRwbHlyOjpsZWFkKGtvbGVqbm9zYywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gQk5fd3lkYXduaWN0d28kc2FtZTINCkJOX3d5ZGF3bmljdHdvJHNhbWUyW2xlbmd0aChCTl93eWRhd25pY3R3byRwb2R6aWVsb25lKV0gPC0gMA0KDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lMiA8LSBsYWcoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSxuPTEpDQpCTl93eWRhd25pY3R3byAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpICYga29sZWpub3NjID09ICJhIiAmIGtvbGVqbm9zYyA9PSBkcGx5cjo6bGFnKGtvbGVqbm9zYywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gQk5fd3lkYXduaWN0d28kc2FtZV9hDQpCTl93eWRhd25pY3R3byRzYW1lX2FbMV0gPC0gMA0KDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lMyA8LSBsZWFkKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsbj0xKQ0KQk5fd3lkYXduaWN0d28kc2FtZV9hMiA8LSBsZWFkKEJOX3d5ZGF3bmljdHdvJHNhbWVfYSxuPTEpDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lIDwtIGlmZWxzZShCTl93eWRhd25pY3R3byRzYW1lX2EyPT0xLHBhc3RlKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsQk5fd3lkYXduaWN0d28kcG9kemllbG9uZTMsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihCTl93eWRhd25pY3R3byRwb2R6aWVsb25lKSkNCkJOX3d5ZGF3bmljdHdvIDwtIEJOX3d5ZGF3bmljdHdvICU+JQ0KICBmaWx0ZXIoc2FtZV9hPT0wKQ0KQk5fd3lkYXduaWN0d28kcG9kemllbG9uZTIgPC0gbGFnKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsbj0xKQ0KDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lIDwtIGlmZWxzZShCTl93eWRhd25pY3R3byRzYW1lPT0wJkJOX3d5ZGF3bmljdHdvJHNhbWUyPT0xLHBhc3RlKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsQk5fd3lkYXduaWN0d28kcG9kemllbG9uZTIsc2VwID0gInwiKSxhcy5jaGFyYWN0ZXIoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSkpDQpCTl93eWRhd25pY3R3byA8LSBjU3BsaXQoQk5fd3lkYXduaWN0d28sInBvZHppZWxvbmUiLCBzZXAgPSAifCIsIGRpcmVjdGlvbiA9ICJsb25nIikNCkJOX3d5ZGF3bmljdHdvJGJlel9yb2t1IDwtIEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUNCkJOX3d5ZGF3bmljdHdvIDwtIEJOX3d5ZGF3bmljdHdvICU+JQ0KICBzZWxlY3QobGljem5payxyb2tfd3lkYW5pYSxYMjYwLGJlel9yb2t1KQ0KQk5fd3lkYXduaWN0d28kcm9rX3d5ZGFuaWEgPC0gYXMuY2hhcmFjdGVyKEJOX3d5ZGF3bmljdHdvJHJva193eWRhbmlhKQ0KQk5fd3lkYXduaWN0d28gPC0gZGRwbHkoQk5fd3lkYXduaWN0d28sIC4obGljem5paywgcm9rX3d5ZGFuaWEsIFgyNjApLCBzdW1tYXJpemUsIGJlel9yb2t1ID0gcGFzdGUoYmV6X3Jva3UsIGNvbGxhcHNlPSIiKSkNCkJOX3d5ZGF3bmljdHdvJGJlel9yb2t1IDwtIHN0cl9yZW1vdmVfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCJcXH4iKQ0KI2RydWdpIHJheg0KQk5fd3lkYXduaWN0d28kYmV6X3Jva3UgPC0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCAiO1xcJGIiLCAiOiRiIikNCkJOX3d5ZGF3bmljdHdvIDwtIG11dGF0ZShCTl93eWRhd25pY3R3bywNCiAgICAgICAgICAgICAgICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgICAgICAgICAgICAgICBpbGVfbWllanNjID0gc3RyX2NvdW50KEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCAiXFwkYSIpLA0KICAgICAgICAgICAgICAgICAgICAgIGtvbGVqbm9zYyA9IHN0cl9yZW1vdmUoc3RyX3JlcGxhY2VfYWxsKGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsICJcXCQuIikpLCAiW15hLXpdIiwgIiIpLCJeYyIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBvZHppZWxvbmUgPSBzdHJfcmVwbGFjZV9hbGwoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsIihcXCQuKSIsInxcXDF+IikpDQoNCkJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUgPC0gc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byRwb2R6aWVsb25lLCJeXFx8IikNCkJOX3d5ZGF3bmljdHdvJGtvbGVqbm9zYyA8LSBzdHJfcmVwbGFjZV9hbGwoQk5fd3lkYXduaWN0d28ka29sZWpub3NjLCIoLikiLCJcXDF8IikNCkJOX3d5ZGF3bmljdHdvJGtvbGVqbm9zYyA8LSBzdHJfcmVtb3ZlKEJOX3d5ZGF3bmljdHdvJGtvbGVqbm9zYywiXFx8JCIpDQpCTl93eWRhd25pY3R3byA8LSBjU3BsaXQoQk5fd3lkYXduaWN0d28sYygia29sZWpub3NjIiwicG9kemllbG9uZSIpLCBzZXAgPSAifCIsIGRpcmVjdGlvbiA9ICJsb25nIikNCkJOX3d5ZGF3bmljdHdvIDwtIEJOX3d5ZGF3bmljdHdvICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHBvZHppZWxvbmUpKQ0KDQpCTl93eWRhd25pY3R3byAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpICYga29sZWpub3NjID09IGRwbHlyOjpsYWcoa29sZWpub3NjLCAxKSB9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBCTl93eWRhd25pY3R3byRzYW1lDQpCTl93eWRhd25pY3R3byRzYW1lWzFdIDwtIDANCg0KQk5fd3lkYXduaWN0d28gJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSAmIGtvbGVqbm9zYyA9PSAiYiIgJiBrb2xlam5vc2MgPT0gZHBseXI6OmxlYWQoa29sZWpub3NjLCAxKSB9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBCTl93eWRhd25pY3R3byRzYW1lMg0KQk5fd3lkYXduaWN0d28kc2FtZTJbbGVuZ3RoKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUpXSA8LSAwDQoNCkJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUyIDwtIGxhZyhCTl93eWRhd25pY3R3byRwb2R6aWVsb25lLG49MSkNCkJOX3d5ZGF3bmljdHdvICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgJiBrb2xlam5vc2MgPT0gImEiICYga29sZWpub3NjID09IGRwbHlyOjpsYWcoa29sZWpub3NjLCAxKSB9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBCTl93eWRhd25pY3R3byRzYW1lX2ENCkJOX3d5ZGF3bmljdHdvJHNhbWVfYVsxXSA8LSAwDQoNCkJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUzIDwtIGxlYWQoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSxuPTEpDQpCTl93eWRhd25pY3R3byRzYW1lX2EyIDwtIGxlYWQoQk5fd3lkYXduaWN0d28kc2FtZV9hLG49MSkNCkJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUgPC0gaWZlbHNlKEJOX3d5ZGF3bmljdHdvJHNhbWVfYTI9PTEscGFzdGUoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSxCTl93eWRhd25pY3R3byRwb2R6aWVsb25lMyxzZXAgPSAiIiksYXMuY2hhcmFjdGVyKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUpKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d28gJT4lDQogIGZpbHRlcihzYW1lX2E9PTApDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lMiA8LSBsYWcoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSxuPTEpDQoNCkJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUgPC0gaWZlbHNlKEJOX3d5ZGF3bmljdHdvJHNhbWU9PTAmQk5fd3lkYXduaWN0d28kc2FtZTI9PTEscGFzdGUoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSxCTl93eWRhd25pY3R3byRwb2R6aWVsb25lMixzZXAgPSAifCIpLGFzLmNoYXJhY3RlcihCTl93eWRhd25pY3R3byRwb2R6aWVsb25lKSkNCkJOX3d5ZGF3bmljdHdvIDwtIGNTcGxpdChCTl93eWRhd25pY3R3bywicG9kemllbG9uZSIsIHNlcCA9ICJ8IiwgZGlyZWN0aW9uID0gImxvbmciKQ0KQk5fd3lkYXduaWN0d28kYmV6X3Jva3UgPC0gQk5fd3lkYXduaWN0d28kcG9kemllbG9uZQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d28gJT4lDQogIHNlbGVjdChsaWN6bmlrLHJva193eWRhbmlhLFgyNjAsYmV6X3Jva3UpDQpCTl93eWRhd25pY3R3byRyb2tfd3lkYW5pYSA8LSBhcy5jaGFyYWN0ZXIoQk5fd3lkYXduaWN0d28kcm9rX3d5ZGFuaWEpDQpCTl93eWRhd25pY3R3byRjenkgPC0gc3RyX2RldGVjdChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwiXFwkYSIpDQpCTl93eWRhd25pY3R3byRiZXpfcm9rdSA8LSBpZmVsc2UoQk5fd3lkYXduaWN0d28kY3p5PT1UUlVFLHBhc3RlKCJ8IixCTl93eWRhd25pY3R3byRiZXpfcm9rdSxzZXAgPSAiIiksYXMuY2hhcmFjdGVyKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1KSkNCkJOX3d5ZGF3bmljdHdvIDwtIGRkcGx5KEJOX3d5ZGF3bmljdHdvLCAuKGxpY3puaWssIHJva193eWRhbmlhLCBYMjYwKSwgc3VtbWFyaXplLCBiZXpfcm9rdSA9IHBhc3RlKGJlel9yb2t1LCBjb2xsYXBzZT0iIikpDQpCTl93eWRhd25pY3R3byRiZXpfcm9rdSA8LSBzdHJfcmVtb3ZlX2FsbChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwiXFx+IikNCkJOX3d5ZGF3bmljdHdvJGJlel9yb2t1IDwtIHN0cl9yZW1vdmVfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCJeXFx8IikNCg0KQk5fd3lkYXduaWN0d28gPC0gY1NwbGl0KEJOX3d5ZGF3bmljdHdvLCAiYmV6X3Jva3UiLCBzZXAgPSAifCIsIGRpcmVjdGlvbiA9ICJsb25nIikNCkJOX3d5ZGF3bmljdHdvIDwtIG11dGF0ZShCTl93eWRhd25pY3R3bywNCiAgICAgICAgICAgICAgICAgIHd5ZGF3bmljdHdvID0gc3RyX2V4dHJhY3RfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCAiKD88PVxcJGIpKC4qKSIpLA0KICAgICAgICAgICAgICAgICAgbWllanNjZV93eWRhbmlhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl9leHRyYWN0X2FsbChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgICAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdChCTl93eWRhd25pY3R3byRiZXpfcm9rdSksICJcXCRcXHciLCAiIiksICJcXFciLCAiIikpLA0KICAgICAgICAgICAgICAgICAgbHAgPSAxOmxlbmd0aHMoQk5fd3lkYXduaWN0d28pKQ0KQk5fd3lkYXduaWN0d28kd3lkYXduaWN0d28gPC0gc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byR3eWRhd25pY3R3bywiXFxzK1xcOyQiKQ0KQk5fd3lkYXduaWN0d28kd3lkYXduaWN0d28gPC0gc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byR3eWRhd25pY3R3bywiXFxzK1xcOiQiKQ0KDQpCTl93eWRhd25pY3R3byRtaWVqc2NlX3d5ZGFuaWEgPC0gc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byRtaWVqc2NlX3d5ZGFuaWEsIiBcXFt7MCwxMH1ldGNcXC57MCwxMH1cXF1cXHN7MCwxMH0kIikNCkJOX3d5ZGF3bmljdHdvJG1pZWpzY2Vfd3lkYW5pYSA8LSBzdHJfcmVtb3ZlKEJOX3d5ZGF3bmljdHdvJG1pZWpzY2Vfd3lkYW5pYSwiIFxcW3swLDEwfWV0Y1xcLnswLDEwfVxcc3swLDEwfSQiKQ0KQk5fd3lkYXduaWN0d28kbWllanNjZV93eWRhbmlhIDwtIGlmZWxzZShncmVwbCgiXFxbIixCTl93eWRhd25pY3R3byRtaWVqc2NlX3d5ZGFuaWEpJiFncmVwbCgiXFxdIixCTl93eWRhd25pY3R3byRtaWVqc2NlX3d5ZGFuaWEpLHN0cl9yZW1vdmUoQk5fd3lkYXduaWN0d28kbWllanNjZV93eWRhbmlhLCJcXFsiKSxhcy5jaGFyYWN0ZXIoQk5fd3lkYXduaWN0d28kbWllanNjZV93eWRhbmlhKSkNCkJOX3d5ZGF3bmljdHdvJHd5ZGF3bmljdHdvIDwtIGlmZWxzZShncmVwbCgiXFxdIixCTl93eWRhd25pY3R3byR3eWRhd25pY3R3bykmIWdyZXBsKCJcXFsiLEJOX3d5ZGF3bmljdHdvJHd5ZGF3bmljdHdvKSxzdHJfcmVtb3ZlKEJOX3d5ZGF3bmljdHdvJHd5ZGF3bmljdHdvLCJcXF0iKSxhcy5jaGFyYWN0ZXIoQk5fd3lkYXduaWN0d28kd3lkYXduaWN0d28pKQ0KQk5fUEJMX3d5ZGF3bmljdHdhIDwtIG1lcmdlKCB4ID0gQk5fd3lkYXduaWN0d28sIHkgPSBQQkxfd3lkYXduaWN0d2EsIGJ5ID0gJ25hendhX3Byb3N0YScsIHNvcnQgPSBGQUxTRSwgYWxsLnggPSBUUlVFLCBhbGxvdy5jYXJ0ZXNpYW4gPSBUUlVFKQ0KQk5fUEJMX3d5ZGF3bmljdHdhJHRvX3NhbW8gPC0gQk5fUEJMX3d5ZGF3bmljdHdhJHd5ZGF3bmljdHdvPT1CTl9QQkxfd3lkYXduaWN0d2EkV1lfTkFaV0ENCkJOX1BCTF93eWRhd25pY3R3YSA8LSBCTl9QQkxfd3lkYXduaWN0d2Fbb3JkZXIoYXMuaW50ZWdlcihhcy5jaGFyYWN0ZXIoQk5fUEJMX3d5ZGF3bmljdHdhJGxpY3puaWspKSwgLUJOX1BCTF93eWRhd25pY3R3YSR0b19zYW1vLCAtQk5fUEJMX3d5ZGF3bmljdHdhJFdZX0xJQ1pCQV9aQVBJU09XKSxdDQoNCkJOX1BCTF93eWRhd25pY3R3YSAlJCUgIA0KICAgIHsgYXMuaW50ZWdlcihsaWN6bmlrKSA9PSBkcGx5cjo6bGFnKGFzLmludGVnZXIobGljem5payksIDEpICYgbmF6d2FfcHJvc3RhPT1sYWcobmF6d2FfcHJvc3RhKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IEJOX1BCTF93eWRhd25pY3R3YSRzYW1lDQpCTl9QQkxfd3lkYXduaWN0d2Ekc2FtZVsxXSA8LSAwDQoNCkJOX1BCTF93eWRhd25pY3R3YSA8LSBCTl9QQkxfd3lkYXduaWN0d2EgJT4lDQogIGZpbHRlcihzYW1lPT0wKQ0KDQp3eV93eWRhd25pY3R3b19pZCA8LSBCTl9QQkxfd3lkYXduaWN0d2EgJT4lDQogIHNlbGVjdChsaWN6bmlrLCBXWV9XWURBV05JQ1RXT19JRCkNCg0Kd3lfd3lkYXduaWN0d29faWQgPC0gd3lfd3lkYXduaWN0d29faWRbb3JkZXIoYXMuaW50ZWdlcihhcy5jaGFyYWN0ZXIod3lfd3lkYXduaWN0d29faWQkbGljem5paykpKSxdDQojMjYNCnd5X21pZWpzY2UgPC0gQk5fUEJMX3d5ZGF3bmljdHdhICU+JQ0KICBzZWxlY3QobGljem5paywgV1lfV1lEQVdOSUNUV09fSUQsbWllanNjZV93eWRhbmlhKQ0Kd3lfbWllanNjZSRtaWVqc2NlX3d5ZGFuaWEgPC0gaWZlbHNlKGlzLm5hKHd5X21pZWpzY2UkV1lfV1lEQVdOSUNUV09fSUQpLGFzLmNoYXJhY3Rlcih3eV9taWVqc2NlJG1pZWpzY2Vfd3lkYW5pYSksIiIpDQoNCiMyNw0Kd3lfbmF6d2EgPC0gQk5fUEJMX3d5ZGF3bmljdHdhICU+JQ0KICBzZWxlY3QobGljem5paywgV1lfV1lEQVdOSUNUV09fSUQsd3lkYXduaWN0d28pDQp3eV9uYXp3YSR3eWRhd25pY3R3byA8LSBpZmVsc2UoaXMubmEod3lfbWllanNjZSRXWV9XWURBV05JQ1RXT19JRCksYXMuY2hhcmFjdGVyKHd5X25hendhJHd5ZGF3bmljdHdvKSwiIikNCg0KIzI4DQp6YV9yb2tfd3lkYW5pYSA8LSBCTl9QQkxfd3lkYXduaWN0d2EgJT4lDQogIHNlbGVjdChsaWN6bmlrLCByb2tfd3lkYW5pYSkgJT4lDQogIHVuaXF1ZSgpDQp6YV9yb2tfd3lkYW5pYSRyb2tfd3lkYW5pYSA8LSBzdHJfcmVwbGFjZV9hbGwoemFfcm9rX3d5ZGFuaWEkcm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIikNCnphX3Jva193eWRhbmlhJGRvYnJ5X3JvayA8LSBpZmVsc2UobmNoYXIoYXMuY2hhcmFjdGVyKHphX3Jva193eWRhbmlhJHJva193eWRhbmlhKSk9PTQsYXMuY2hhcmFjdGVyKHphX3Jva193eWRhbmlhJHJva193eWRhbmlhKSxOQSkNCnphX3Jva193eWRhbmlhJGRvX29waXN1IDwtIGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSRkb2JyeV9yb2spLHBhc3RlKCJbIixzdHJfZXh0cmFjdCh6YV9yb2tfd3lkYW5pYSRyb2tfd3lkYW5pYSwiXFxkezR9IiksIl0iLHNlcCA9ICIiKSwiIikNCiMyOQ0KbWFyY19maWVsZDMwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5payxYMzAwKQ0KbWFyY19maWVsZDMwMCRYMzAwPC1zdHJfcmVtb3ZlX2FsbChtYXJjX2ZpZWxkMzAwJFgzMDAsIl5cXHwiKQ0KbWFyY19maWVsZDMwMCA8LSBtdXRhdGUobWFyY19maWVsZDMwMCwNCiAgICAgICAgICAgICAgIGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChtYXJjX2ZpZWxkMzAwJFgzMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGQzMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCg0KbWFyY19maWVsZDMwMDwtY2JpbmQobWFyY19maWVsZDMwMCxlbXB0eV90YWJsZSkNCg0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgbWFyY19maWVsZDMwMCRYMzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGQzMDAkWDMwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KfQ0KZm9yIChpIGluIHgpIHsNCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0Kc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQpzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQpzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQpzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQptYXJjX2ZpZWxkMzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGQzMDAkWDMwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGQzMDAkWDMwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSAgDQp9DQptYXJjX2ZpZWxkMzAwJGAkYWAgPC0gc3RyX3JlbW92ZShtYXJjX2ZpZWxkMzAwJGAkYWAsIiBcXDsrJHwgXFw6KyQiKQ0KbWFyY19maWVsZDMwMCRgJGFgW2lzLm5hKG1hcmNfZmllbGQzMDAkYCRhYCldIDwtICIiDQoNCnphX29waXNfa3MgPC0gZGF0YS5mcmFtZShvcGlzX2tzID0gcGFzdGUoemFfcm9rX3d5ZGFuaWEkZG9fb3Bpc3UsIG1hcmNfZmllbGQzMDAkYCRhYCxtYXJjX2ZpZWxkMzAwJGAkYmAsc2VwID0gIiwgIiksIGxpY3puaWsgPSBhcy5pbnRlZ2VyKHphX3Jva193eWRhbmlhJGxpY3puaWspKQ0KemFfb3Bpc19rcyRvcGlzX2tzIDwtIHN0cl9yZXBsYWNlKHphX29waXNfa3Mkb3Bpc19rcywiLCAsICIsICIsICIpDQp6YV9vcGlzX2tzJG9waXNfa3MgPC0gc3RyX3JlcGxhY2UoemFfb3Bpc19rcyRvcGlzX2tzLCIsICwgIiwgIiwgIikNCnphX29waXNfa3Mkb3Bpc19rcyA8LSBzdHJfcmVtb3ZlX2FsbCh6YV9vcGlzX2tzJG9waXNfa3MsICJeLCB8LCAkIikNCndzcF9pbmZvIDwtIGRhdGEuZnJhbWUod3NwID0gcGFzdGUoIltXc3DDs8WCd3lkLjogIixCTl9hdXRvciRhdXRvcnp5LCI6ICIsemFfdHl0dWxfY29weSR0eXR1bCwiXSIsIHNlcCA9ICIiKSwgemFfdXdhZ2kpDQp3c3BfaW5mbyR6YV91d2FnaSA8LSBzdHJfcmVtb3ZlX2FsbCh3c3BfaW5mbyR6YV91d2FnaSwiXzIiKQ0Kd3NwX2luZm8gJSQlICANCiAgICB7IHphX3V3YWdpID09IGRwbHlyOjpsYWcoemFfdXdhZ2ksIDEpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gd3NwX2luZm8kc2FtZQ0Kd3NwX2luZm8kc2FtZVsxXSA8LSAwDQp3c3BfaW5mbyA8LSBkYXRhLmZyYW1lKHdzcF9pbmZvLCB6YV91d2FnaSkNCndzcF9pbmZvJHphX3V3YWdpIDwtIGlmZWxzZShncmVwbCgiXzIiLCB3c3BfaW5mbyR6YV91d2FnaS4xKSwgYXMuY2hhcmFjdGVyKHdzcF9pbmZvJHphX3V3YWdpKSxwYXN0ZSh3c3BfaW5mbyR6YV91d2FnaSwiXzIiLHNlcCA9ICIiKSkNCg0Kd3NwX2luZm8gPC0gd3NwX2luZm8gJT4lDQogIHNlbGVjdCgxLDIpDQp3c3BfaW5mbyA8LSBtZXJnZSh4PXdzcF9pbmZvLCB5PXphX3V3YWdpLCBieSA9ICJ6YV91d2FnaSIpDQp3c3BfaW5mbyA8LSB3c3BfaW5mbyAlPiUNCiAgc2VsZWN0KDIsMykNCnphX29waXNfZml6eWN6bnlfa3NpYXpraSA8LSBtZXJnZSh4PXphX29waXNfa3MseT13c3BfaW5mbywgYnkgPSAibGljem5payIsYWxsID0gVFJVRSkNCnphX29waXNfZml6eWN6bnlfa3NpYXpraSA8LSBkYXRhLmZyYW1lKHphX29waXNfZml6eWN6bnlfa3NpYXpraSA9IHBhc3RlKHN0cl9yZXBsYWNlX2FsbCh6YV9vcGlzX2Zpenljem55X2tzaWF6a2kkb3Bpc19rcywiKC4qKShjbVxcLikoLiopIiwgIlxcMVxcMiIpLCB6YV9vcGlzX2Zpenljem55X2tzaWF6a2kkd3NwLCBzZXAgPSAiICIpLCBsaWN6bmlrID0gemFfb3Bpc19maXp5Y3pueV9rc2lhemtpJGxpY3puaWspDQoNCiMzMA0KbWFyY19maWVsZDQ5MCA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5payxYNDkwKQ0KbWFyY19maWVsZDQ5MCA8LSBjU3BsaXQobWFyY19maWVsZDQ5MCwiWDQ5MCIsc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikNCm1hcmNfZmllbGQ0OTAgPC0gbWFyY19maWVsZDQ5MCU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpDQptYXJjX2ZpZWxkNDkwJFg0OTA8LXN0cl9yZW1vdmVfYWxsKG1hcmNfZmllbGQ0OTAkWDQ5MCwiXlxcfCIpDQptYXJjX2ZpZWxkNDkwIDwtIG11dGF0ZShtYXJjX2ZpZWxkNDkwLA0KICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKG1hcmNfZmllbGQ0OTAkWDQ5MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg0OTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZDQ5MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KDQptYXJjX2ZpZWxkNDkwPC1jYmluZChtYXJjX2ZpZWxkNDkwLGVtcHR5X3RhYmxlKQ0KDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KDQpmb3IgKGkgaW4geCkgew0KICBtYXJjX2ZpZWxkNDkwJFg0OTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZDQ5MCRYNDkwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQp9DQpmb3IgKGkgaW4geCkgew0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQpzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCnN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCnN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCnN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCm1hcmNfZmllbGQ0OTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZDQ5MCRYNDkwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZDQ5MCRYNDkwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQpwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpICANCn0NCg0KbWFyY19maWVsZDQ5MCRgJGFgIDwtIHN0cl9yZW1vdmUobWFyY19maWVsZDQ5MCRgJGFgLCIgXFw7KyR8IFxcOiskIikNCm1hcmNfZmllbGQ0OTAkYCRhYFtpcy5uYShtYXJjX2ZpZWxkNDkwJGAkYWApXSA8LSAiIg0KbWFyY19maWVsZDQ5MCRgJHZgW2lzLm5hKG1hcmNfZmllbGQ0OTAkYCR2YCldIDwtICIiDQptYXJjX2ZpZWxkNDkwJHNlcmlhIDwtIHN0cl9yZW1vdmUocGFzdGUoIigiLG1hcmNfZmllbGQ0OTAkYCRhYCwiLCAiLG1hcmNfZmllbGQ0OTAkYCR2YCwiKSIsc2VwID0gIiIpLCIsICg/PVxcKSQpIikNCg0KbWFyY19maWVsZDQ5MCA8LSBtYXJjX2ZpZWxkNDkwICU+JQ0KICBzZWxlY3QobGljem5payxzZXJpYSkNCg0KbWFyY19maWVsZDQ5MCA8LSBkZHBseShtYXJjX2ZpZWxkNDkwLCAuKGxpY3puaWspLCBzdW1tYXJpemUsIHNlcmlhID0gcGFzdGUoc2VyaWEsIGNvbGxhcHNlPSIgIikpDQp0ZXN0IDwtIGRhdGEgJT4lDQogIHNlbGVjdChsaWN6bmlrKQ0KemFfc2VyaWFfd3lkYXduaWN6YSA8LSBtZXJnZSh4ID0gdGVzdCwgeSA9IG1hcmNfZmllbGQ0OTAsIGJ5ID0gImxpY3puaWsiLCBhbGwgPSBUUlVFKQ0KIzMxDQp6YV90b215IDwtZGF0YS5mcmFtZShsaWN6bmlrPTE6bGVuZ3RocyhkYXRhKSwgemFfdG9teSA9IE5BKQ0KIzMyDQpwcmFjb3duaWsgPC0gbWVyZ2UoeCA9IGR6X25hendhX2Z1bGwsIHkgPSByZWRha3Rvcnp5X2R6aWFsb3csIGJ5LnggPSAiVFdfRFpfRFpJQUxfSUQiLCBieS55ID0gICJEWl9EWklBTF9JRCIsIGFsbC54ID0gVFJVRSkNCnByYWNvd25payA8LSBwcmFjb3duaWtbb3JkZXIoYXMuaW50ZWdlcihhcy5jaGFyYWN0ZXIocHJhY293bmlrJGxpY3puaWspKSksXQ0KcHJhY293bmlrIDwtIHByYWNvd25payAlPiUNCiAgc2VsZWN0KGxpY3puaWsscmVkYWt0b3JfZHppYWx1KQ0KY29sbmFtZXMocHJhY293bmlrKSA8LSBjKCJsaWN6bmlrIiwgInByYWNvd25payIpDQoNCmR6X25hendhX2Z1bGwgPC0gZGF0YS5mcmFtZShkel9uYXp3YV9mdWxsLCBwcmFjb3duaWsgPSBwcmFjb3duaWskcHJhY293bmlrKQ0KIzMzIGFkbm90YWNqZQ0KemFfYWRub3RhY2plIDwtIGRhdGEuZnJhbWUoY2JpbmQoZGF0YSRsaWN6bmlrLCBkYXRhJFg1MDUpKQ0KY29sbmFtZXMoemFfYWRub3RhY2plKSA8LSBjKCJsaWN6bmlrIiwiWDUwNSIpDQp6YV9hZG5vdGFjamUkWDUwNSA8LSBpZmVsc2UoaXMubmEoemFfYWRub3RhY2plJFg1MDUpLCIiLGFzLmNoYXJhY3Rlcih6YV9hZG5vdGFjamUkWDUwNSkpDQp6YV9hZG5vdGFjamUkYWRub3RhY2plIDwtIHBhc3RlKHphX2Fkbm90YWNqZSRhZG5vdGFjamUsemFfYWRub3RhY2plJFg1MDUsc2VwID0gInwiKQ0KemFfYWRub3RhY2plJGFkbm90YWNqZVt6YV9hZG5vdGFjamUkYWRub3RhY2plPT0ifCJdIDwtICIiDQp6YV9hZG5vdGFjamUgPC0gemFfYWRub3RhY2plICU+JQ0KICBzZWxlY3QoMSwyKQ0KI8WCxIVjemVuaWUNCiN3eXLDs3duYW5pZSBsaWN6Ynkgd2llcnN6eQ0KYXV0b3J6eSA8LSBkYXRhLmZyYW1lKGNiaW5kKGFtX2F1dG9yX2lkJGxpY3puaWssYW1fYXV0b3JfaWQkQU1fQVVUT1JfSUQsYXMuY2hhcmFjdGVyKGFtX25hendpc2tvJGFtX25hendpc2tvKSxhcy5jaGFyYWN0ZXIoYW1faW1pZSRhbV9pbWllKSkpDQpjb2xuYW1lcyhhdXRvcnp5KSA8LSBjKCJsaWN6bmlrIiwgIkFNX0FVVE9SX0lEIiwgIkFNX05BWldJU0tPIiwgIkFNX0lNSUUiKQ0KYXV0b3J6eSRBTV9BVVRPUl9JRCA8LSBpZmVsc2UoaXMubmEoYXV0b3J6eSRBTV9BVVRPUl9JRCksIiIsYXMuY2hhcmFjdGVyKGF1dG9yenkkQU1fQVVUT1JfSUQpKQ0KYXV0b3J6eSRBTV9OQVpXSVNLTyA8LSBpZmVsc2UoaXMubmEoYXV0b3J6eSRBTV9OQVpXSVNLTyksIiIsYXMuY2hhcmFjdGVyKGF1dG9yenkkQU1fTkFaV0lTS08pKQ0KYXV0b3J6eSRBTV9JTUlFIDwtIGlmZWxzZShpcy5uYShhdXRvcnp5JEFNX0lNSUUpLCIiLGFzLmNoYXJhY3RlcihhdXRvcnp5JEFNX0lNSUUpKQ0KYXV0b3J6eSA8LSBkZHBseShhdXRvcnp5LCAuKGxpY3puaWspLCBzdW1tYXJpemUsIEFNX0FVVE9SX0lEID0gcGFzdGUoQU1fQVVUT1JfSUQsIGNvbGxhcHNlPSJ8IiksIEFNX05BWldJU0tPID0gcGFzdGUoQU1fTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIEFNX0lNSUUgPSBwYXN0ZShBTV9JTUlFLCBjb2xsYXBzZT0ifCIpKQ0KYXV0b3J6eSA8LSBhdXRvcnp5W29yZGVyKGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKGF1dG9yenkkbGljem5paykpKSxdDQoNCndzcG9sdHdvcmN5IDwtIGRhdGEuZnJhbWUoY2JpbmQoQk5fUEJMX3dzcG9sdHdvcmN5JGxpY3puaWssIEJOX1BCTF93c3BvbHR3b3JjeSRPU19PU09CQV9JRCxhcy5jaGFyYWN0ZXIoYl9vc19uYXp3aXNrbyRvc19uYXp3aXNrbyksYXMuY2hhcmFjdGVyKGJfb3NfaW1pZSRvc19pbWllKSxCTl9QQkxfd3Nwb2x0d29yY3kkZm9fc3ltYm9sKSkNCmNvbG5hbWVzKHdzcG9sdHdvcmN5KSA8LSBjKCJsaWN6bmlrIiwgIk9TX09TT0JBX0lEIiwgIk9TX05BWldJU0tPIiwgIk9TX0lNSUUiLCAiRk9fU1lNQk9MIikNCndzcG9sdHdvcmN5JE9TX09TT0JBX0lEIDwtIGlmZWxzZShpcy5uYSh3c3BvbHR3b3JjeSRPU19PU09CQV9JRCksIiIsYXMuY2hhcmFjdGVyKHdzcG9sdHdvcmN5JE9TX09TT0JBX0lEKSkNCndzcG9sdHdvcmN5JE9TX05BWldJU0tPIDwtIGlmZWxzZShpcy5uYSh3c3BvbHR3b3JjeSRPU19OQVpXSVNLTyksIiIsYXMuY2hhcmFjdGVyKHdzcG9sdHdvcmN5JE9TX05BWldJU0tPKSkNCndzcG9sdHdvcmN5JE9TX0lNSUUgPC0gaWZlbHNlKGlzLm5hKHdzcG9sdHdvcmN5JE9TX0lNSUUpLCIiLGFzLmNoYXJhY3Rlcih3c3BvbHR3b3JjeSRPU19JTUlFKSkNCndzcG9sdHdvcmN5JEZPX1NZTUJPTCA8LSBpZmVsc2UoaXMubmEod3Nwb2x0d29yY3kkRk9fU1lNQk9MKSwiIixhcy5jaGFyYWN0ZXIod3Nwb2x0d29yY3kkRk9fU1lNQk9MKSkNCndzcG9sdHdvcmN5IDwtIGRkcGx5KHdzcG9sdHdvcmN5LCAuKGxpY3puaWspLCBzdW1tYXJpemUsIE9TX09TT0JBX0lEID0gcGFzdGUoT1NfT1NPQkFfSUQsIGNvbGxhcHNlPSJ8IiksIE9TX05BWldJU0tPID0gcGFzdGUoT1NfTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIE9TX0lNSUUgPSBwYXN0ZShPU19JTUlFLCBjb2xsYXBzZT0ifCIpLCBGT19TWU1CT0wgPSBwYXN0ZShGT19TWU1CT0wsIGNvbGxhcHNlPSJ8IikpDQp3c3BvbHR3b3JjeSA8LSB3c3BvbHR3b3JjeVtvcmRlcihhcy5pbnRlZ2VyKGFzLmNoYXJhY3Rlcih3c3BvbHR3b3JjeSRsaWN6bmlrKSkpLF0NCg0Kd3lkYXduaWN0d2EgPC0gZGF0YS5mcmFtZShjYmluZCh3eV93eWRhd25pY3R3b19pZCRsaWN6bmlrLCB3eV93eWRhd25pY3R3b19pZCRXWV9XWURBV05JQ1RXT19JRCx3eV9uYXp3YSR3eWRhd25pY3R3byx3eV9taWVqc2NlJG1pZWpzY2Vfd3lkYW5pYSkpDQpjb2xuYW1lcyh3eWRhd25pY3R3YSkgPC0gYygibGljem5payIsICJXWV9XWURBV05JQ1RXT19JRCIsICJXWV9OQVpXQSIsICJXWV9NSUVKU0NFIikNCnd5ZGF3bmljdHdhJFdZX1dZREFXTklDVFdPX0lEIDwtIGlmZWxzZShpcy5uYSh3eWRhd25pY3R3YSRXWV9XWURBV05JQ1RXT19JRCksIiIsYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdhJFdZX1dZREFXTklDVFdPX0lEKSkNCnd5ZGF3bmljdHdhJFdZX05BWldBIDwtIGlmZWxzZShpcy5uYSh3eWRhd25pY3R3YSRXWV9OQVpXQSksIiIsYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdhJFdZX05BWldBKSkNCnd5ZGF3bmljdHdhJFdZX01JRUpTQ0UgPC0gaWZlbHNlKGlzLm5hKHd5ZGF3bmljdHdhJFdZX01JRUpTQ0UpLCIiLGFzLmNoYXJhY3Rlcih3eWRhd25pY3R3YSRXWV9NSUVKU0NFKSkNCnd5ZGF3bmljdHdhIDwtIGRkcGx5KHd5ZGF3bmljdHdhLCAuKGxpY3puaWspLCBzdW1tYXJpemUsIFdZX1dZREFXTklDVFdPX0lEID0gcGFzdGUoV1lfV1lEQVdOSUNUV09fSUQsIGNvbGxhcHNlPSJ8IiksIFdZX05BWldBID0gcGFzdGUoV1lfTkFaV0EsIGNvbGxhcHNlPSJ8IiksIFdZX01JRUpTQ0UgPSBwYXN0ZShXWV9NSUVKU0NFLCBjb2xsYXBzZT0ifCIpKQ0Kd3lkYXduaWN0d2EgPC0gd3lkYXduaWN0d2Fbb3JkZXIoYXMuaW50ZWdlcihhcy5jaGFyYWN0ZXIod3lkYXduaWN0d2EkbGljem5paykpKSxdDQoNCnBvbGFjem9uZSA8LSBkYXRhLmZyYW1lKA0KICBsaWN6bmlrID0gemFfdXdhZ2kkbGljem5paywNCiAgcmVrb3JkX0JOID0gemFfdXdhZ2kkemFfdXdhZ2ksDQogIHJ6X25hendhID0gcnpfbmF6d2EkcnpfbmF6d2EsDQogIHphX3JvX3JvayA9IHphX3JvX3JvayR6YV9yb19yb2ssDQogIHphX3R5cGUgPSB6YV90eXBlJHphX3R5cGUsDQogIHJ6X3JvZHphal9pZCA9IHJ6X3JvZHphal9pZCRSWl9ST0RaQUpfSUQsDQogIERaX05BWldBID0gZHpfbmF6d2EkRFpfTkFaV0EsDQogIERaX0RaSUFMX0lEID0gZHpfZHppYWxfaWQkRFpfRFpJQUxfSUQsDQogIHR3X3R3b3JjYV9pZCA9IHR3X3R3b3JjYV9pZCRUV19UV09SQ0FfSUQsDQogIGFtX2F1dG9yX2lkID0gYXV0b3J6eSRBTV9BVVRPUl9JRCwNCiAgYW1fbmF6d2lza28gPSBhdXRvcnp5JEFNX05BWldJU0tPLA0KICBhbV9pbWllID0gYXV0b3J6eSRBTV9JTUlFLA0KICB6YV90eXR1bCA9IHphX3R5dHVsJHR5dHVsLA0KICB6YV90eXR1bF9vcnlnaW5hbHUgPSB6YV90eXR1bF9vcnlnaW5hbHUkdHl0dWwsDQogIHphX2plenlrX29yeWdpbmFsdSA9IHphX2plenlrX29yeWdpbmFsdSRqZXp5a19vcnlnaW5hbHUsDQogIG9zX29zb2JhX2lkID0gd3Nwb2x0d29yY3kkT1NfT1NPQkFfSUQsDQogIG9zX25hendpc2tvID0gd3Nwb2x0d29yY3kkT1NfTkFaV0lTS08sDQogIG9zX2ltaWUgPSB3c3BvbHR3b3JjeSRPU19JTUlFLA0KICBmb19zeW1ib2wgPSB3c3BvbHR3b3JjeSRGT19TWU1CT0wsDQogIHphX29waXNfd3Nwb2x0d29yY293ID0gemFfb3Bpc193c3BvbHR3b3Jjb3ckemFfb3Bpc193c3BvbHR3b3Jjb3csDQogIHphX3d5ZGFuaWUgPSB6YV93eWRhbmllJHphX3d5ZGFuaWUsDQogIHphX3RvbXkgPSB6YV90b215JHphX3RvbXksDQogIHphX2luc3R5dHVjamEgPSB6YV9pbnN0eXR1Y2phJGluc3R5dHVjamEsDQogIHd5X3d5ZGF3bmljdHdvX2lkID0gd3lkYXduaWN0d2EkV1lfV1lEQVdOSUNUV09fSUQsDQogIHd5X21pZWpzY2UgPSB3eWRhd25pY3R3YSRXWV9NSUVKU0NFLA0KICB3eV9uYXp3YSA9IHd5ZGF3bmljdHdhJFdZX05BWldBLA0KICB6YV9yb2tfd3lkYW5pYSA9IHphX3Jva193eWRhbmlhJGRvYnJ5X3JvaywNCiAgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpID0gemFfb3Bpc19maXp5Y3pueV9rc2lhemtpJHphX29waXNfZml6eWN6bnlfa3NpYXpraSwNCiAgemFfc2VyaWFfd3lkYXduaWN6YSA9IHphX3NlcmlhX3d5ZGF3bmljemEkc2VyaWEsDQogIHR3X25hendpc2tvID0gdHdfbmF6d2lza28kVFdfTkFaV0lTS08sDQogIHR3X2ltaWUgPSB0d19pbWllJFRXX0lNSUUsDQogIHByYWNvd25payA9IHByYWNvd25payRwcmFjb3duaWssDQogIHphX2Fkbm90YWNqZSA9IHphX2Fkbm90YWNqZSRYNTA1DQopDQoNCm91dCA8LSBjU3BsaXQocG9sYWN6b25lLCBjKCJhbV9hdXRvcl9pZCIsICJhbV9uYXp3aXNrbyIsICJhbV9pbWllIiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgImZvX3N5bWJvbCIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiksc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikNCm91dCA8LSBvdXQgJT4lDQogIHVuaXF1ZSgpDQpvdXQkbGljem5payA8LSBpZmVsc2UoaXMubmEob3V0JGxpY3puaWspLCcnLGFzLmNoYXJhY3RlcihvdXQkbGljem5paykpDQpvdXQkcmVrb3JkX0JOIDwtIGlmZWxzZShpcy5uYShvdXQkcmVrb3JkX0JOKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJla29yZF9CTikpDQpvdXQkcnpfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKG91dCRyel9uYXp3YSksJycsYXMuY2hhcmFjdGVyKG91dCRyel9uYXp3YSkpDQpvdXQkemFfcm9fcm9rIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9fcm9rKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3JvX3JvaykpDQpvdXQkemFfdHlwZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5cGUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHlwZSkpDQpvdXQkcnpfcm9kemFqX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfcm9kemFqX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJ6X3JvZHphal9pZCkpDQpvdXQkRFpfTkFaV0EgPC0gaWZlbHNlKGlzLm5hKG91dCREWl9OQVpXQSksJycsYXMuY2hhcmFjdGVyKG91dCREWl9OQVpXQSkpDQpvdXQkRFpfRFpJQUxfSUQgPC0gaWZlbHNlKGlzLm5hKG91dCREWl9EWklBTF9JRCksJycsYXMuY2hhcmFjdGVyKG91dCREWl9EWklBTF9JRCkpDQpvdXQkdHdfdHdvcmNhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfdHdvcmNhX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X3R3b3JjYV9pZCkpDQpvdXQkYW1fYXV0b3JfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9hdXRvcl9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9hdXRvcl9pZCkpDQpvdXQkYW1fbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9uYXp3aXNrbykpDQpvdXQkYW1faW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JGFtX2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1faW1pZSkpDQpvdXQkemFfdHl0dWwgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXR1bCksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bCkpDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1IDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWxfb3J5Z2luYWx1KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5dHVsX29yeWdpbmFsdSkpDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1IDwtIGlmZWxzZShpcy5uYShvdXQkemFfamV6eWtfb3J5Z2luYWx1KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2plenlrX29yeWdpbmFsdSkpDQpvdXQkb3Nfb3NvYmFfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19vc29iYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRvc19vc29iYV9pZCkpDQpvdXQkb3NfbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCRvc19uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCRvc19uYXp3aXNrbykpDQpvdXQkb3NfaW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JG9zX2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfaW1pZSkpDQpvdXQkZm9fc3ltYm9sIDwtIGlmZWxzZShpcy5uYShvdXQkZm9fc3ltYm9sKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGZvX3N5bWJvbCkpDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdyksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdykpDQpvdXQkemFfd3lkYW5pZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3d5ZGFuaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfd3lkYW5pZSkpDQpvdXQkemFfdG9teSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3RvbXkpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdG9teSkpDQpvdXQkemFfaW5zdHl0dWNqYSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2luc3R5dHVjamEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfaW5zdHl0dWNqYSkpDQpvdXQkd3lfd3lkYXduaWN0d29faWQgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV93eWRhd25pY3R3b19pZCksJycsYXMuY2hhcmFjdGVyKG91dCR3eV93eWRhd25pY3R3b19pZCkpDQpvdXQkd3lfbWllanNjZSA8LSBpZmVsc2UoaXMubmEob3V0JHd5X21pZWpzY2UpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbWllanNjZSkpDQpvdXQkd3lfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9uYXp3YSksJycsYXMuY2hhcmFjdGVyKG91dCR3eV9uYXp3YSkpDQpvdXQkemFfcm9rX3d5ZGFuaWEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9yb2tfd3lkYW5pYSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb2tfd3lkYW5pYSkpDQpvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSkpDQpvdXQkemFfc2VyaWFfd3lkYXduaWN6YSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfc2VyaWFfd3lkYXduaWN6YSkpDQpvdXQkdHdfbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCR0d19uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCR0d19uYXp3aXNrbykpDQpvdXQkdHdfaW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JHR3X2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfaW1pZSkpDQpvdXQkcHJhY293bmlrIDwtIGlmZWxzZShpcy5uYShvdXQkcHJhY293bmlrKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHByYWNvd25paykpDQpvdXQkemFfYWRub3RhY2plIDwtIGlmZWxzZShpcy5uYShvdXQkemFfYWRub3RhY2plKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2Fkbm90YWNqZSkpDQoNCm91dCAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpICYgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCm91dCRzYW1lWzFdIDwtIDANCm91dCRkemllbG9uZSA8LSBwYXN0ZShvdXQkYW1fYXV0b3JfaWQsb3V0JGFtX25hendpc2tvLG91dCRhbV9pbWllLG91dCRvc19vc29iYV9pZCxvdXQkb3NfbmF6d2lza28sb3V0JG9zX2ltaWUsb3V0JGZvX3N5bWJvbCxvdXQkd3lfd3lkYXduaWN0d29faWQsb3V0JHd5X21pZWpzY2Usb3V0JHd5X25hendhLHNlcCA9ICIiKQ0KDQpvdXQgPC0gb3V0ICU+JQ0KICBmaWx0ZXIoIShzYW1lPT0xJmR6aWVsb25lPT0iIikpICU+JQ0KICBzZWxlY3QoMTozMykNCg0Kb3V0ICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgJiByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBvdXQkc2FtZQ0KDQpvdXQkcmVrb3JkX0JOW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfbmF6d2Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb19yb2tbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXBlW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfcm9kemFqX2lkW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfTkFaV0Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCREWl9EWklBTF9JRFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X3R3b3JjYV9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3dbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV93eWRhbmllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdG9teVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2luc3R5dHVjamFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb2tfd3lkYW5pYVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19uYXp3aXNrb1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X2ltaWVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRwcmFjb3duaWtbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9hZG5vdGFjamVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCg0Kb3V0IDwtIG91dCAlPiUNCiAgc2VsZWN0KDE6MzMpDQp3cml0ZS5jc3YyKG91dCwgIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMDUtMjAwOF9oYXJsZXF1aW55X2RvX2ltcG9ydHUuY3N2Iiwgcm93Lm5hbWVzID0gRiwgbmEgPSAnJywgZmlsZUVuY29kaW5nID0gJ1dpbmRvd3MtMTI1MCcpDQojb3V0IDwtIHJlYWQuY3N2MigiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvMjAwNS0yMDA4X3BvZG1pb3Rvd2FfZG9faW1wb3J0dS5jc3YiLCBlbmNvZGluZyA9ICJXaW5kb3dzLTEyNTAiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQojb3V0JHJla29yZF9CTiA8LSBpZmVsc2UoaXMubmEob3V0JHJla29yZF9CTiksIiIsIGFzLmNoYXJhY3RlcihvdXQkcmVrb3JkX0JOKSkNCiNvdXQkcmVrb3JkX0JOIDwtIGlmZWxzZShuY2hhcihvdXQkcmVrb3JkX0JOKT09MTMsb3V0JHJla29yZF9CTiwgc3ByaW50ZigiJTAxM2QiLCBhcy5pbnRlZ2VyKG91dCRyZWtvcmRfQk4pKSkNCiNvdXQkcmVrb3JkX0JOW291dCRyZWtvcmRfQk49PSIgICAgICAgICAgIE5BIl0gPC0gIiINCg0KDQoNCmBgYA0KDQpgYGB7ciBwcnp5Z290b3dhbmllIHBsaWt1IGRvIG1hc293ZWdvIG5hZHBpc2FuaWEgcmVrb3Jkw7N3IHcgYmF6aWV9DQojbW/FvGUgbmllIG1hIHNlbnN1IHphcGlzeXdhxIcgdHljaCBwbGlrw7N3IHdjemXFm25pZWosIHR5bGtvIHRlcmF6IGplIHBvxYJhY3p5xIc/DQojdG8gbXVzesSFIG1pZcSHIGlubsSFIG5henfEmQ0KI2EgbW/FvGUgenJvYmnEhyBwxJl0bMSZIHogd2N6eXRhbmllbSwgxbxlIHNpxJkgcGxpa2kgZG9kYWrEhT8gLSBmYWpuZSwgYWxlIHRvIHBpZXJ3c3plIGJhcmR6aWVqIHByYWt0eWN6bmUNCg0KYGBgDQoNCmBgYHtyIHByenlnb3Rvd2FuaWUgbGlzdCBwcmFjb3duaWvDs3d9DQojZG9jZWxvd28gcHJ6eWdvdG93dWplbXkgcGxpayBvZCByYXp1IG5hIGR5c2ssIGFsZSBuYSByYXppZSB4bHN4IGRvIHdncmFuaWEgbmEgZHlzaw0KI3BvIHR5bSBwcnp5Z290b3dhxIcgbmEgZHlza3UgdW5pa2F0b3dlIGxpbmtpDQoNCg0KI2JuX29rICsgbnVtZXIgemFwaXN1IHBvenlza2FueSBuYSBwb2RzdGF3aWUgd3lzenVrYW5pYSB3IGJhemllIGRhbnljaA0KDQojZG9jZWxvd28gYsSZZHppZW15IHR3b3J6ecSHIGxpc3R5IHByYWNvd25pa8OzdyBvZCByYXp1IG5hIGR5c2t1LCBuYSByYXppZSBmdW5rY2phIHR3b3J6ZW5pYSBqZXN0IGNpxIVnbGUgcm96d2lqYW5hIHByemV6IHR3w7NyY8OzdyBwYWtpZXR1LCB3acSZYyBww7NraSBjbyB6b3N0YWplIHhzbHgNCmtvbGVqbm9zYyA8LSBjKCJwcmFjb3duaWsiLCJaQV9aQVBJU19JRCIsInR5cF9rc2lhemtpIiwibGluayIsImxpbmtfMSIsInJvayIsInN0YXR1cyIsImJsYWRfd19pbXBvcmNpZV90eXR1bHUiLCJYMTAwIiwiWDI0NSIsIlg2NTAiLCJYNjU1IiwiWDI0NiIsIlgyNTAiLCJYMjYwIiwiWDMwMCIsIlgzODAiLCJYNDkwIiwiWDUwMCIsIlg1MDEiLCJYNTQ2IiwiWDYwMCIsIlg3MDAiLCJYMDQxIiwiWDA4MCIpDQp0ZXN0IDwtIGJuX29rICU+JQ0KICBzZWxlY3QocHJhY293bmlrID0gcmVkYWt0b3JfZHppYWx1LHR5cF9rc2lhemtpID0gcm9kemFqX2tzaWF6a2ksbGluayA9IEJOX1VSTCwgcm9rLCBYMTAwLCBYMjQ1LCBYNjUwLCBYNjU1LCBYMjQ2LCBYMjUwLCBYMjYwLCBYMzAwLCBYNDkwLCBYNTAwLCBYNTAxLCBYNTQ2LCBYNjAwLCBYNzAwLCBYMDQxLCBYMDgwKSAlPiUNCiAgbXV0YXRlKGxpbmtfMSA9IHBhc3RlKCI9SFlQRVJMSU5LKFwiIixsaW5rLCJcIjtcImxpbmsgZG8ga3NpxIXFvGtpIHcgQk5cIikiLHNlcCA9ICIiKSwNCiAgICAgICAgIGJsYWRfd19pbXBvcmNpZV90eXR1bHUgPSBGQUxTRSkNCg0KI3R1dGFqIHd5c3p1a2FuaWUgYmF6eSwga3TDs3JlIGRhIGlkIHphcGlzdSBpIHN0YXR1cywgcG90ZW0gbWVyZ2UgaSBzZWxlY3QlPiUNCiAgc2VsZWN0KG5vcXVvdGUoa29sZWpub3NjKSkNCg0KI1pBX1pBUElTX0lELHN0YXR1cyBwb2JyYW5lIHogYmF6eSB0dcW8IHBvIGltcG9yY2llDQojcHJhY293bmlrCVpBX1pBUElTX0lECXR5cF9rc2lhemtpCWxpbmsJbGluawlyb2sJc3RhdHVzCWJsYWRfd19pbXBvcmNpZV90eXR1bHUJWDEwMAlYMjQ1CVg2NTAJWDY1NQlYMjQ2CVgyNTAJWDI2MAlYMzAwCVgzODAJWDQ5MAlYNTAwCVg1MDEJWDU0NglYNjAwCVg3MDAJWDA0MQlYMDgwDQoNCmBgYA0KDQpgYGB7ciBrc2nEhcW8a2kgd3Nww7PFgnd5ZGFuZSBoYXJsZXF1aW55fQ0KZGF0YSA8LSBoYXJsZXF1aW55DQpkYXRhJFgyNDUgPC0gc3RyX3JlcGxhY2VfYWxsKGRhdGEkWDI0NSwgIlxcXVxcLiAiLCAiXXwkYSIpDQpkYXRhJFgyNDUgPC0gc3RyX3JlcGxhY2VfYWxsKGRhdGEkWDI0NSwgIlxcL1teXFwkXSIsICIvJGMiKQ0KZGF0YSA8LSBjU3BsaXQoZGF0YSwgYygiWDI0NSIsICJYMjQ2IiksIHNlcCA9ICJ8IiwgZGlyZWN0aW9uID0gImxvbmciKQ0KZGF0YSA8LSBkYXRhLmZyYW1lKGRhdGEsIGxpY3puaWsgPSAxOmxlbmd0aChkYXRhJGlkKSkNCg0KI3V3b2xuaWVuaWUga29sdW1uIHogZGFueW1pIHogYm4gaSBwcnpldHdvcnplbmllIGRvIFBCTA0KIzENCnphX3V3YWdpIDwtIGRhdGEgJT4lDQogIHNlbGVjdCh6YV91d2FnaSA9IGlkLCBsaWN6bmlrKQ0KemFfdXdhZ2kkemFfdXdhZ2kgPC0gc3RyX3JlcGxhY2VfYWxsKHphX3V3YWdpJHphX3V3YWdpLCIgIiwiMCIpDQp6YV91d2FnaSR6YV91d2FnaSA8LSBpZmVsc2UobmNoYXIoemFfdXdhZ2kkemFfdXdhZ2kpPT0xMyx6YV91d2FnaSR6YV91d2FnaSwgc3ByaW50ZigiJTAxM2QiLCBhcy5pbnRlZ2VyKHphX3V3YWdpJHphX3V3YWdpKSkpDQoNCnphX3V3YWdpICUkJSAgDQogICAgeyB6YV91d2FnaSA9PSBkcGx5cjo6bGFnKHphX3V3YWdpLCAxKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IHphX3V3YWdpJHNhbWUNCnphX3V3YWdpJHNhbWVbMV0gPC0gMA0KemFfdXdhZ2kkemFfdXdhZ2kgPC0gaWZlbHNlKHphX3V3YWdpJHNhbWU9PTEscGFzdGUoemFfdXdhZ2kkemFfdXdhZ2ksIl8yIiwgc2VwID0gIiIpLHphX3V3YWdpJHphX3V3YWdpKQ0KDQp6YV91d2FnaSA8LSB6YV91d2FnaSAlPiUNCiAgc2VsZWN0KDEsMikNCiMyDQpyel9uYXp3YSA8LSBkYXRhLmZyYW1lKHJ6X25hendhID0gcmVwKCJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiLCBsZW5ndGgoMTpsZW5ndGgoemFfdXdhZ2kkemFfdXdhZ2kpKSkpDQpyel9uYXp3YSA8LSBkYXRhLmZyYW1lKHJ6X25hendhID0gcnpfbmF6d2EkcnpfbmF6d2EsIGxpY3puaWsgPSAxOmxlbmd0aHMocnpfbmF6d2EpKQ0KIzMNCnphX3JvX3JvayA8LSBkYXRhICU+JQ0KICBzZWxlY3QoemFfcm9fcm9rID0gcm9rLCBsaWN6bmlrKQ0KIzQNCnphX3R5cGUgPC0gZGF0YS5mcmFtZShsaWN6bmlrID0gZGF0YSRsaWN6bmlrLCB6YV90eXBlID0gIktTIikNCiM1DQpyel9yb2R6YWpfaWQgPC0gbWVyZ2UoeCA9IHJ6X25hendhLCB5ID0gUEJMX3JvZHphamVfemFwaXNvdywgYnkueCA9ICdyel9uYXp3YScsIGJ5LnkgPSAnUlpfTkFaV0EnLCBzb3J0ID0gRkFMU0UsYWxsLnggPSBUUlVFKQ0Kcnpfcm9kemFqX2lkIDwtIHJ6X3JvZHphal9pZFtvcmRlcihyel9yb2R6YWpfaWQkbGljem5payksXQ0Kcnpfcm9kemFqX2lkIDwtIHJ6X3JvZHphal9pZCAlPiUNCiAgc2VsZWN0KFJaX1JPRFpBSl9JRCwgbGljem5paykNCiM2DQpCTl9hdXRvciA8LSBkYXRhLmZyYW1lKGF1dG9yenkgPSBhcy5jaGFyYWN0ZXIoc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwgIig/PD1cXC9cXCRjKSguKikoPz0gOykiKSksIGxpY3puaWsgPSBkYXRhJGxpY3puaWspDQpCTl9hdXRvciA8LSBtdXRhdGUoQk5fYXV0b3IsDQogICAgICAgICAgICAgICAgICAgbmF6d2EgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKEJOX2F1dG9yJGF1dG9yenkpLCAiXFxXIiwgIiIpKQ0KDQpuYXp3YTIgPC0gaWZlbHNlKGlzLm5hKFBCTF9hdXRvcnp5JEFNX0lNSUUpLGFzLmNoYXJhY3RlcihQQkxfYXV0b3J6eSRBTV9OQVpXSVNLTykscGFzdGUoUEJMX2F1dG9yenkkQU1fSU1JRSxQQkxfYXV0b3J6eSRBTV9OQVpXSVNLTywgc2VwID0gIiIpKQ0KbmF6d2EyIDwtIGRhdGEuZnJhbWUobmF6d2EyID0gc3RyX3RvX2xvd2VyKHN0cl9yZXBsYWNlX2FsbChuYXp3YTIsICJcXFciLCAiIikpKQ0KbmF6d2EyIDwtIGRhdGEuZnJhbWUobmF6d2EyID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihuYXp3YTIkbmF6d2EyKSwgIlxcVyIsICIiKSkNClBCTF9hdXRvcnp5IDwtIGRhdGEuZnJhbWUoUEJMX2F1dG9yenksIG5hendhMiA9IG5hendhMiRuYXp3YTIpDQpQQkxfYXV0b3J6eSA8LSBQQkxfYXV0b3J6eSAlPiUNCiAgZmlsdGVyKG5hendhMiAhPSAibmFuYSIpDQoNCkJOX1BCTF9hdXRvciA8LSBtZXJnZSh4ID0gQk5fYXV0b3IsIHkgPSBQQkxfYXV0b3J6eSwgYnkueCA9ICduYXp3YScsIGJ5LnkgPSAnbmF6d2EyJywgc29ydCA9IEZBTFNFLCBhbGwueCA9IFRSVUUpDQpCTl9QQkxfYXV0b3IgPC0gQk5fUEJMX2F1dG9yW29yZGVyKEJOX1BCTF9hdXRvciRsaWN6bmlrLCBCTl9QQkxfYXV0b3IkQU1fQVVUT1JfSUQpLF0NCg0KQk5fUEJMX2F1dG9yIDwtIEJOX1BCTF9hdXRvcltvcmRlcihCTl9QQkxfYXV0b3IkbGljem5paywgLUJOX1BCTF9hdXRvciRBTV9MSUNaQkFfWkFQSVNPVyksXQ0KDQpCTl9QQkxfYXV0b3IgJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSB9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBCTl9QQkxfYXV0b3Ikc2FtZQ0KQk5fUEJMX2F1dG9yJHNhbWVbMV0gPC0gMA0KDQpCTl9QQkxfYXV0b3IgPC0gQk5fUEJMX2F1dG9yICU+JQ0KICBmaWx0ZXIoc2FtZT09MCkgJT4lDQogIHNlbGVjdCgxOjE0KQ0KY29sbmFtZXMoQk5fUEJMX2F1dG9yKVsxNF0gPC0gIm5hendhX25hel9pbSINCkJOX2F1dG9yX3BvZHppZWxvbnkgPC0gZGF0YS5mcmFtZShhdXRvciA9IHN0cl9yZXBsYWNlX2FsbChCTl9hdXRvciRhdXRvcnp5LCAiKCAoPyEuKiApKSIsInwiKSwgbGljem5payA9IEJOX2F1dG9yJGxpY3puaWspDQpCTl9hdXRvcl9wb2R6aWVsb255IDwtIGNTcGxpdChCTl9hdXRvcl9wb2R6aWVsb255LCBjKCJhdXRvciIpLCBzZXAgPSAifCIsIGRpcmVjdGlvbiA9ICJ3aWRlIikNCkJOX1BCTF9hdXRvciA8LSBtZXJnZShCTl9QQkxfYXV0b3IsQk5fYXV0b3JfcG9kemllbG9ueSxieSA9ICJsaWN6bmlrIiwgYWxsID0gVFJVRSkNCg0KYW1fYXV0b3JfaWQgPC0gQk5fUEJMX2F1dG9yICU+JQ0KICBzZWxlY3QobGljem5paywgQU1fQVVUT1JfSUQpDQojNw0KYW1fbmF6d2lza28gPC0gZGF0YS5mcmFtZShuYXp3aXNrbyA9IEJOX2F1dG9yX3BvZHppZWxvbnkkYXV0b3JfMiwgbGljem5payA9IEJOX2F1dG9yX3BvZHppZWxvbnkkbGljem5paykNCmF1dF9pZF9uYXp3IDwtIG1lcmdlKHggPSBhbV9uYXp3aXNrbywgeSA9IGFtX2F1dG9yX2lkLCBieSA9ICJsaWN6bmlrIiwgYWxsLng9VFJVRSkNCmFtX25hendpc2tvIDwtIGRhdGEuZnJhbWUoYW1fbmF6d2lza28gPSBpZmVsc2UoaXMubmEoYXV0X2lkX25henckQU1fQVVUT1JfSUQpLGFzLmNoYXJhY3RlcihhdXRfaWRfbmF6dyRuYXp3aXNrbyksIE5BKSwgbGljem5payA9IGF1dF9pZF9uYXp3JGxpY3puaWspDQojOA0KYW1faW1pZSA8LSBkYXRhLmZyYW1lKGltaWUgPSBCTl9hdXRvcl9wb2R6aWVsb255JGF1dG9yXzEsIGxpY3puaWsgPSBCTl9hdXRvcl9wb2R6aWVsb255JGxpY3puaWspDQphdXRfaWRfaW1pZSA8LSBtZXJnZSh4ID0gYW1faW1pZSwgeSA9IGFtX2F1dG9yX2lkLCBieSA9ICJsaWN6bmlrIiwgYWxsLng9VFJVRSkNCmFtX2ltaWUgPC0gZGF0YS5mcmFtZShhbV9pbWllID0gaWZlbHNlKGlzLm5hKGF1dF9pZF9pbWllJEFNX0FVVE9SX0lEKSxhcy5jaGFyYWN0ZXIoYXV0X2lkX2ltaWUkaW1pZSksIE5BKSwgbGljem5payA9IGF1dF9pZF9uYXp3JGxpY3puaWspDQojOQ0KdHdfdHdvcmNhX2lkIDwtIG1lcmdlKHggPSBCTl9QQkxfYXV0b3IsIHkgPSBQQkxfYXV0b3JfdG9fdHdvcmNhLCBieS54ID0gJ0FNX0FVVE9SX0lEJywgYnkueSA9ICdpZCBhdXRvcmEnLCBzb3J0ID0gRkFMU0UsIGFsbC54ID0gVFJVRSkNCnR3X3R3b3JjYV9pZCA8LSBtZXJnZSh4ID0gdHdfdHdvcmNhX2lkLCB5ID0gUEJMX3R3b3JjeSwgYnkueCA9ICdpZCB0d29yY3knLCBieS55ID0gJ1RXX1RXT1JDQV9JRCcsIHNvcnQgPSBGQUxTRSwgYWxsLnggPSBUUlVFKQ0KdHdfdHdvcmNhX2lkIDwtIHR3X3R3b3JjYV9pZCAlPiUNCiAgc2VsZWN0KGxpY3puaWssYGlkIHR3b3JjeWAsQU1fTkFaV0lTS089YXV0b3JfMixBTV9JTUlFPWF1dG9yXzEsIERaX05BWldBLCBUV19EWl9EWklBTF9JRCkNCnR3X3R3b3JjYV9pZCRgaWQgdHdvcmN5YFt0d190d29yY2FfaWQkVFdfRFpfRFpJQUxfSUQ9PTQzMF0gPC0gTkENCnR3X3R3b3JjYV9pZCRBTV9OQVpXSVNLT1t0d190d29yY2FfaWQkVFdfRFpfRFpJQUxfSUQ9PTQzMF0gPC0gTkENCnR3X3R3b3JjYV9pZCRBTV9JTUlFW3R3X3R3b3JjYV9pZCRUV19EWl9EWklBTF9JRD09NDMwXSA8LSBOQQ0KQk5fUEJMX3R3b3JjYSA8LSB0d190d29yY2FfaWQgJT4lDQogICAgc2VsZWN0KDEsVFdfVFdPUkNBX0lEID0gMixUV19OQVpXSVNLTyA9IDMsVFdfSU1JRSA9IDQsRFpfTkFaV0EsVFdfRFpfRFpJQUxfSUQpDQoNCnR3X3R3b3JjYV9pZCA8LSB0d190d29yY2FfaWQgJT4lDQogIHNlbGVjdCgxLFRXX1RXT1JDQV9JRCA9IDIsVFdfTkFaV0lTS08gPSAzLFRXX0lNSUUgPSA0KQ0KDQp0d190d29yY2FfaWQgPC0gdHdfdHdvcmNhX2lkW29yZGVyKHR3X3R3b3JjYV9pZCRsaWN6bmlrLHR3X3R3b3JjYV9pZCRUV19UV09SQ0FfSUQsdHdfdHdvcmNhX2lkJFRXX05BWldJU0tPLHR3X3R3b3JjYV9pZCRUV19JTUlFKSxdDQp0d190d29yY2FfaWQgPC0gdHdfdHdvcmNhX2lkICU+JQ0KICB1bmlxdWUoKQ0KdHdfdHdvcmNhX2lkICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gdHdfdHdvcmNhX2lkJHNhbWUNCnR3X3R3b3JjYV9pZCRzYW1lWzFdIDwtIDANCnR3X3R3b3JjYV9pZCA8LSB0d190d29yY2FfaWQgJT4lDQogIGZpbHRlcihzYW1lPT0wKSAlPiUNCiAgc2VsZWN0KC1sZW5ndGgodHdfdHdvcmNhX2lkKSkNCiMxMA0KdHdfbmF6d2lza28gPC0gdHdfdHdvcmNhX2lkDQp0d19uYXp3aXNrbyRUV19OQVpXSVNLT1shaXMubmEodHdfbmF6d2lza28kVFdfVFdPUkNBX0lEKV0gPC0gTkENCnR3X25hendpc2tvIDwtIHR3X25hendpc2tvICU+JQ0KICBzZWxlY3QobGljem5payxUV19OQVpXSVNLTykNCiMxMQ0KdHdfaW1pZSA8LSB0d190d29yY2FfaWQNCnR3X2ltaWUkVFdfSU1JRVshaXMubmEodHdfaW1pZSRUV19UV09SQ0FfSUQpXSA8LSBOQQ0KdHdfaW1pZSA8LSB0d19pbWllICU+JQ0KICBzZWxlY3QobGljem5payxUV19JTUlFKQ0KIzEyDQpCTl9QQkxfdHdvcmNhIDwtIEJOX1BCTF90d29yY2Fbb3JkZXIoQk5fUEJMX3R3b3JjYSRsaWN6bmlrLEJOX1BCTF90d29yY2EkVFdfVFdPUkNBX0lELEJOX1BCTF90d29yY2EkVFdfTkFaV0lTS08sQk5fUEJMX3R3b3JjYSRUV19JTUlFKSxdDQpCTl9QQkxfdHdvcmNhIDwtIEJOX1BCTF90d29yY2EgJT4lDQogIHVuaXF1ZSgpDQpCTl9QQkxfdHdvcmNhICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gQk5fUEJMX3R3b3JjYSRzYW1lDQpCTl9QQkxfdHdvcmNhJHNhbWVbMV0gPC0gMA0KQk5fUEJMX3R3b3JjYSA8LSBCTl9QQkxfdHdvcmNhICU+JQ0KICBmaWx0ZXIoc2FtZT09MCkgJT4lDQogIHNlbGVjdCgtbGVuZ3RoKEJOX1BCTF90d29yY2EpKQ0KDQpkel9uYXp3YV9mdWxsIDwtIEJOX1BCTF90d29yY2ENCmR6X25hendhX2Z1bGwgPC0gZHpfbmF6d2FfZnVsbFtvcmRlcihkel9uYXp3YV9mdWxsJGxpY3puaWspLF0NCg0KI2R6aWHFgiBuYSBwb2RzdGF3aWUgbGl0ZXJhdHVyeQ0KbGl0ZXJhdHVyYV9CTiA8LSBCTl9QQkxfdHdvcmNhICU+JQ0KICAgIHNlbGVjdChsaWN6bmlrLFRXX1RXT1JDQV9JRCxUV19OQVpXSVNLTyxUV19JTUlFKQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5payxYNjU1KSU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpDQptYXJjX2ZpZWxkXzY1NSRYNjU1PC1zdHJfcmVwbGFjZV9hbGwobWFyY19maWVsZF82NTUkWDY1NSwiKF58XFx8KSIsIn5cXDEiKQ0KbWFyY19maWVsZF82NTU8LSBjU3BsaXQobWFyY19maWVsZF82NTUsIlg2NTUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpDQptYXJjX2ZpZWxkXzY1NTwtIG1hcmNfZmllbGRfNjU1JT4lDQogIGZpbHRlcihYNjU1IT0iIikNCm1hcmNfZmllbGRfNjU1JFg2NTU8LXN0cl9yZW1vdmVfYWxsKG1hcmNfZmllbGRfNjU1JFg2NTUsIl5cXHwiKQ0KbWFyY19maWVsZF82NTUgPC0gbXV0YXRlKG1hcmNfZmllbGRfNjU1LA0KICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKG1hcmNfZmllbGRfNjU1JFg2NTUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNjU1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjU1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQoNCm1hcmNfZmllbGRfNjU1PC1jYmluZChtYXJjX2ZpZWxkXzY1NSxlbXB0eV90YWJsZSkNCg0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgbWFyY19maWVsZF82NTUkWDY1NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1NSRYNjU1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQp9DQpmb3IgKGkgaW4geCkgew0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQpzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCnN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCnN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCnN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCm1hcmNfZmllbGRfNjU1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjU1JFg2NTUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1NSRYNjU1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCmxpdGVyYXR1cmFfQk4gPC0gbWVyZ2UoeCA9IGxpdGVyYXR1cmFfQk4sIHkgPSBtYXJjX2ZpZWxkXzY1NSwgYnkueCA9ICJsaWN6bmlrIixhbGwueCA9IFRSVUUpDQpsaXRlcmF0dXJhX0JOIDwtIGxpdGVyYXR1cmFfQk4gJT4lDQogIHNlbGVjdCgxLDIsMyw0LFg2NTUgPSA3KQ0KDQp0d19kb191c3RhbGVuaWEgPC0gbGl0ZXJhdHVyYV9CTiAlPiUNCiAgZmlsdGVyKGlzLm5hKFRXX1RXT1JDQV9JRCkpDQoNCmR6X29zb2JfYmV6X3RlYXRyIDwtIFBCTF9kel9vc29iX2Jlel90ZWF0cnUgJT4lDQogIHNlbGVjdCgxLDIpICU+JQ0KICB1bmlxdWUoKQ0KDQpkel9vc29iX2Jlel90ZWF0ciA8LSBtdXRhdGUoZHpfb3NvYl9iZXpfdGVhdHIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXp3YSA9IHN1YnN0cihzdHJfcmVwbGFjZShkel9vc29iX2Jlel90ZWF0ciREWl9OQVpXQSwgIiguKj9cXCgpKC4qPykoXFwpLiokKSIsIlxcMiIpLDEsbmNoYXIoc3RyX3JlcGxhY2UoZHpfb3NvYl9iZXpfdGVhdHIkRFpfTkFaV0EsICIoLio/XFwoKSguKj8pKFxcKS4qJCkiLCJcXDIiKSktMSkpDQoNCnJlY3puZSA8LSBkYXRhLmZyYW1lKERaX0RaSUFMX0lEID0gYyg2OTcsNjk3LDY5Nyw2OTcsODI1LDEwMzcsMTE4NywxNDU0LDg4NCw5MDIsNTQ0LDU0NCw1NDQsNTQ0KSxEWl9OQVpXQSA9IGMoIkhhc8WCYSBvc29ib3dlIChicnl0eWpza2EgaSBpcmxhbmR6a2EpIiwiSGFzxYJhIG9zb2Jvd2UgKGJyeXR5anNrYSBpIGlybGFuZHprYSkiLCJIYXPFgmEgb3NvYm93ZSAoYnJ5dHlqc2thIGkgaXJsYW5kemthKSIsIkhhc8WCYSBvc29ib3dlIChicnl0eWpza2EgaSBpcmxhbmR6a2EpIiwiSGFzxYJhIG9zb2Jvd2UgKGdyZWNrYSBzdGFyb8W8eXRuYSkiLCJIYXPFgmEgb3NvYm93ZSAoxYJhY2nFhHNrYSBzdGFyb8W8eXRuYSkiLCJIYXPFgmEgb3NvYm93ZSAoc3lyeWpza2EpIiwiSGFzxYJhIG9zb2Jvd2UgKGVzcGVyYW50bykiLCJIYXPFgmEgb3NvYm93ZSAoaG9sZW5kZXJza2EpIiwiSGFzxYJhIG9zb2Jvd2UgKEluZGlpKSIsIkhhc8WCYSBvc29ib3dlIChBZnJ5a2kgU3Vic2FoYXJ5anNraWVqKSIsIkhhc8WCYSBvc29ib3dlIChBZnJ5a2kgU3Vic2FoYXJ5anNraWVqKSIsIkhhc8WCYSBvc29ib3dlIChBZnJ5a2kgU3Vic2FoYXJ5anNraWVqKSIsIkhhc8WCYSBvc29ib3dlIChBZnJ5a2kgU3Vic2FoYXJ5anNraWVqKSIpLCByZWRha3Rvcl9kemlhbHUgPSBjKCJCRUFUQUsiLCJCRUFUQUsiLCJCRUFUQUsiLCJCRUFUQUsiLCJCRUFUQVMiLCJCRUFUQVMiLCJCRUFUQUQiLCJDRVpBUlkiLCJUT01BU1pVIiwiRVdBIiwiRVdBIiwiRVdBIiwiRVdBIiwiRVdBIiksIG5hendhID0gYygiYW5naWVsc2siLCJzemtvY2siLCJpcmxhbmR6ayIsIndhbGlqc2siLCJncmVjayIsIsWCYWNpxYRzayIsInN5cnlqc2siLCJlc3BlcmFuY2siLCJuaWRlcmxhbmR6ayIsImluZHlqc2siLCJwb8WCdWRuaW93b2FmcnlrYSIsInNlbmVnYWxzayIsIm5pZ2VyeWpzayIsImFmcnlrYcWEc2siKSkNCnJlY3puZSA8LSByZWN6bmUgJT4lDQogIHNlbGVjdCgxLDIsNCkNCmR6X29zb2JfYmV6X3RlYXRyIDwtIHJiaW5kKGR6X29zb2JfYmV6X3RlYXRyLHJlY3puZSkNCmR6X29zb2JfYmV6X3RlYXRyJG5hendhW2R6X29zb2JfYmV6X3RlYXRyJG5hendhPT0ibGl0ZXJhdHVyYSBwb2xzayJdIDwtICJwb2xzayINCg0KbGl0ZXJhdHVyYV9keiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHR3X2RvX3VzdGFsZW5pYSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIGR6X29zb2JfYmV6X3RlYXRyIGIgb24gYS5YNjU1IGxpa2UgKCclJ3x8Yi5uYXp3YXx8JyUnKSIpDQoNCmxpdGVyYXR1cmFfZHogPC0gbGl0ZXJhdHVyYV9keltvcmRlcihsaXRlcmF0dXJhX2R6JGxpY3puaWssbGl0ZXJhdHVyYV9keiRUV19OQVpXSVNLTyxsaXRlcmF0dXJhX2R6JFRXX0lNSUUsbGl0ZXJhdHVyYV9keiREWl9EWklBTF9JRCksXQ0KbGl0ZXJhdHVyYV9keiAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpIH0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IGxpdGVyYXR1cmFfZHokc2FtZQ0KbGl0ZXJhdHVyYV9keiRzYW1lWzFdIDwtIDANCmxpdGVyYXR1cmFfZHogPC0gbGl0ZXJhdHVyYV9keiAlPiUNCiAgZmlsdGVyKHNhbWU9PTApICU+JQ0KICBzZWxlY3QoLWxlbmd0aChsaXRlcmF0dXJhX2R6KSkNCnRlc3QgPC0gbXV0YXRlKEJOX1BCTF90d29yY2EsDQogICAgICAgICAgICAgICBwb2xhY3pvbmUgPSBwYXN0ZShCTl9QQkxfdHdvcmNhJFRXX1RXT1JDQV9JRCxCTl9QQkxfdHdvcmNhJGxpY3puaWssQk5fUEJMX3R3b3JjYSRUV19OQVpXSVNLTyxCTl9QQkxfdHdvcmNhJFRXX0lNSUUsc2VwID0gInwiKSkNCmxpdGVyYXR1cmFfZHogPC0gbXV0YXRlKGxpdGVyYXR1cmFfZHosDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xhY3pvbmUgPSBwYXN0ZShsaXRlcmF0dXJhX2R6JFRXX1RXT1JDQV9JRCxsaXRlcmF0dXJhX2R6JGxpY3puaWssbGl0ZXJhdHVyYV9keiRUV19OQVpXSVNLTyxsaXRlcmF0dXJhX2R6JFRXX0lNSUUsc2VwID0gInwiKSkNCg0KdGVzdCA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRlc3QgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBsaXRlcmF0dXJhX2R6IGIgb24gYS5wb2xhY3pvbmU9Yi5wb2xhY3pvbmUiKQ0KDQp0ZXN0JFRXX0RaX0RaSUFMX0lEIDwtIGlmZWxzZShpcy5uYSh0ZXN0JFRXX1RXT1JDQV9JRCksIHRlc3QkRFpfRFpJQUxfSUQsdGVzdCRUV19EWl9EWklBTF9JRCkNCnRlc3QkRFpfTkFaV0EgPC0gaWZlbHNlKGlzLm5hKHRlc3QkVFdfVFdPUkNBX0lEKSwgdGVzdCREWl9OQVpXQS4uMTQsIHRlc3QkRFpfTkFaV0EpDQpCTl9QQkxfdHdvcmNhX2Z1bGwgPC0gdGVzdCAlPiUNCiAgZmlsdGVyKCFpcy5uYShUV19EWl9EWklBTF9JRCkpICU+JQ0KICBzZWxlY3QoMToxNikNCnRlc3QgPC0gdGVzdCAlPiUNCiAgZmlsdGVyKGlzLm5hKFRXX0RaX0RaSUFMX0lEKSkgJT4lDQogIHNlbGVjdCgxOjE2KQ0KDQpkel9uYXp3YV9mdWxsIDwtIEJOX1BCTF90d29yY2FfZnVsbCAlPiUNCiAgc2VsZWN0KFRXX1RXT1JDQV9JRCxsaWN6bmlrLERaX05BWldBLCBUV19EWl9EWklBTF9JRCwgdHdfaW1pZT1UV19JTUlFLCB0d19uYXp3aXNrbz1UV19OQVpXSVNLTykNCmR6X25hendhX2Z1bGwgPC0gZHpfbmF6d2FfZnVsbFtvcmRlcihkel9uYXp3YV9mdWxsJGxpY3puaWspLF0NCg0KZHpfbmF6d2EgPC0gZHpfbmF6d2FfZnVsbCAlPiUNCiAgc2VsZWN0KGxpY3puaWssIERaX05BWldBKQ0KIzEzDQpkel9kemlhbF9pZCA8LSBkel9uYXp3YV9mdWxsICU+JQ0KICBzZWxlY3QobGljem5paywgRFpfRFpJQUxfSUQ9VFdfRFpfRFpJQUxfSUQpDQojMTQNCm1hcmNfZmllbGQgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KGxpY3puaWssWDI0NSkjJT4lDQptYXJjX2ZpZWxkJFgyNDU8LXN0cl9yZW1vdmVfYWxsKG1hcmNfZmllbGQkWDI0NSwiXlxcfCIpDQptYXJjX2ZpZWxkIDwtIG11dGF0ZShtYXJjX2ZpZWxkLA0KICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKG1hcmNfZmllbGQkWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KDQptYXJjX2ZpZWxkPC1jYmluZChtYXJjX2ZpZWxkLGVtcHR5X3RhYmxlKQ0KDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KDQpmb3IgKGkgaW4geCkgew0KICBtYXJjX2ZpZWxkJFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZCRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQp9DQpmb3IgKGkgaW4geCkgew0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQpzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCnN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCnN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCnN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCm1hcmNfZmllbGRbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZCRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZCRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQpwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpICANCn0NCm1hcmNfZmllbGQkYCRhYFtpcy5uYShtYXJjX2ZpZWxkJGAkYWApXSA8LSAiIg0KemFfdHl0dWwgPC0gZGF0YS5mcmFtZSh0eXR1bF9ibiA9IHBhc3RlKG1hcmNfZmllbGQkYCRhYCxtYXJjX2ZpZWxkJGAkYmAsc2VwID0gIiIpLCBsaWN6bmlrID0gbWFyY19maWVsZCRsaWN6bmlrKQ0KemFfdHl0dWwkdHl0dWxfYm4gPC0gc3RyX3JlbW92ZSh6YV90eXR1bCR0eXR1bF9ibiwgIlxccytcXC8kIikNCnphX3R5dHVsIDwtIG11dGF0ZSh6YV90eXR1bCwNCiAgICAgICAgICAgICAgICAgICB0eXR1bCA9IGdzdWIoIihbYS16xJnDs8SFxZvFgsW8xbrEh8WEXSkoICkoOikoIHswLDF9KShcXCh7MCwxfSkoW2EtesSZw7PEhcWbxYLFvMW6xIfFhEEtWsSYw5PEhMWaxYHFu8W5xIbFg10pKC4pIiwiXFwxLlxcMlxcVVxcNVxcNlxcRVxcNyIscGVybCA9IFRSVUUsIHphX3R5dHVsJHR5dHVsX2JuKSkNCnphX3R5dHVsJHR5dHVsIDwtIGdzdWIoIiggKSg6KSggezAsMX1bYS16XSkoLikiLCJcXDFcXFVcXDNcXEVcXDQiLHBlcmwgPSBUUlVFLCB6YV90eXR1bCR0eXR1bCkNCnphX3R5dHVsJHR5dHVsIDwtIHN0cl9yZXBsYWNlKHphX3R5dHVsJHR5dHVsLCAiKFteXFwuXSkoXFwuJCkiLCJcXDEiKQ0KemFfdHl0dWwgPC0gemFfdHl0dWwgJT4lDQogIHNlbGVjdCgyLDMpDQp6YV90eXR1bF9jb3B5IDwtIHphX3R5dHVsDQoNCmxpc3RhX2dhdF9wYmwgPC0gZGF0YS5mcmFtZShnYXR1bmVrID0gYygiYWZvcnl6bSIsImFsYnVtIiwiYW50b2xvZ2lhIiwiYXV0b2Jpb2dyYWZpYSIsImR6aWVubmlrIiwiZXNlaiIsImZlbGlldG9uIiwiaW5uZSIsImthemFuaWUiLCJsaXN0IiwibWluaWF0dXJhIHByb3rEhSIsIm9wb3dpYWRhbmllIiwicG9lbWF0IiwicG93aWXFm8SHIiwicHJvemEiLCJwcm96YSBwb2V0eWNrYSIsInJlcG9ydGHFvCIsInJvem15xZtsYW5pZSByZWxpZ2lqbmUiLCJyeXN1bmVrLCBvYnJheiIsInNjZW5hcml1c3oiLCJzemtpYyIsInRla3N0IGJpYmxpam55IiwidGVrc3QgZHJhbWF0eWN6bnkiLCJ3aWVyc3oiLCJ3c3BvbW5pZW5pZSIsInd5cG93aWVkxboiKSkNCg0KdGVzdCA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5payxYNjU1LFg2NTApDQp0ZXN0MiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgZnJvbSB0ZXN0DQogICAgICAgICAgICAgIGxlZnQgam9pbiBsaXN0YV9nYXRfcGJsIG9uIGxvd2VyKHRlc3QuWDY1MCkgbGlrZSAnJSd8fGxpc3RhX2dhdF9wYmwuZ2F0dW5la3x8JyUnIikNCnRlc3QgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgIGZyb20gdGVzdA0KICAgICAgICAgICAgICBsZWZ0IGpvaW4gbGlzdGFfZ2F0X3BibCBvbiBsb3dlcih0ZXN0Llg2NTUpIGxpa2UgJyUnfHxsaXN0YV9nYXRfcGJsLmdhdHVuZWt8fCclJyIpDQp0ZXN0IDwtIHRlc3QgJT4lDQogIHNlbGVjdChsaWN6bmlrLGdhdHVuZWspDQp0ZXN0MiA8LSB0ZXN0MiAlPiUNCiAgc2VsZWN0KGxpY3puaWssZ2F0dW5laykNCnRlc3QgPC0gcmJpbmQodGVzdCx0ZXN0MikNCnRlc3QgPC0gdGVzdCAlPiUNCiAgdW5pcXVlKCkNCiAgDQp0ZXN0IDwtIHRlc3Rbb3JkZXIodGVzdCRsaWN6bmlrLHRlc3QkZ2F0dW5layksXQ0KdGVzdCAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpIH0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IHRlc3Qkc2FtZQ0KdGVzdCRzYW1lWzFdIDwtIDANCnRlc3QgPC0gdGVzdCAlPiUNCiAgZmlsdGVyKHNhbWU9PTApICU+JQ0KICBzZWxlY3QoLWxlbmd0aCh0ZXN0KSkNCg0KemFfdHl0dWwgPC0gbWVyZ2UoeD16YV90eXR1bCx5PXRlc3QsIGJ5ID0gImxpY3puaWsiLCBhbGwueCA9IFRSVUUpDQp6YV90eXR1bCR0eXR1bCA8LSBpZmVsc2UoIWlzLm5hKHphX3R5dHVsJGdhdHVuZWspLHBhc3RlKHphX3R5dHVsJHR5dHVsLCIuIFsiLGdzdWIoIiheLikiLCJcXFVcXDEiLHBlcmwgPSBUUlVFLCB6YV90eXR1bCRnYXR1bmVrKSwiXSIsc2VwID0gIiIpLHphX3R5dHVsJHR5dHVsKQ0KIzE1DQptYXJjX2ZpZWxkIDwtIGRhdGEgJT4lDQogIHNlbGVjdChsaWN6bmlrLFgyNDYpDQptYXJjX2ZpZWxkJFgyNDYgPC0gc3RyX3JlcGxhY2VfYWxsKG1hcmNfZmllbGQkWDI0NiwiKF58XFx8KSIsIn5cXDEiKQ0KbWFyY19maWVsZCA8LSBjU3BsaXQobWFyY19maWVsZCwiWDI0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikNCm1hcmNfZmllbGQkWDI0Njwtc3RyX3JlbW92ZV9hbGwobWFyY19maWVsZCRYMjQ2LCJeXFx8IikNCm1hcmNfZmllbGQgPC0gbXV0YXRlKG1hcmNfZmllbGQsDQogICAgICAgICAgICAgICBpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwobWFyY19maWVsZCRYMjQ2LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NiwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQoNCm1hcmNfZmllbGQ8LWNiaW5kKG1hcmNfZmllbGQsZW1wdHlfdGFibGUpDQoNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQoNCmZvciAoaSBpbiB4KSB7DQogIG1hcmNfZmllbGQkWDI0NiA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkJFgyNDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCn0NCmZvciAoaSBpbiB4KSB7DQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCnN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0Kc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0Kc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0Kc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KbWFyY19maWVsZFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkJFgyNDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkJFgyNDYpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCnByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgIA0KfQ0KY29sbmFtZXMobWFyY19maWVsZClbN10gPC0gImlubmEiDQptYXJjX2ZpZWxkJGAkYWBbaXMubmEobWFyY19maWVsZCRgJGFgKV0gPC0gIiINCm1hcmNfZmllbGQkYCRiYFtpcy5uYShtYXJjX2ZpZWxkJGAkYmApXSA8LSAiIg0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIG1hcmNfZmllbGQgJT4lDQogIHNlbGVjdChsaWN6bmlrLGAkYWAsYCRiYCxgJGlgKQ0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIG11dGF0ZSh6YV90eXR1bF9vcnlnaW5hbHUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5dHVsID0gaWZlbHNlKGdyZXBsKCJ5dFxcLnswLDF9IG9yeWd8eXRcXC57MCwxfW9yeWd8eXRcXC57MCwxfSBvcmd8eXR1W2zFgl0gb3J5Z2luYSIsemFfdHl0dWxfb3J5Z2luYWx1JGAkaWApLHBhc3RlKHphX3R5dHVsX29yeWdpbmFsdSRgJGFgLHphX3R5dHVsX29yeWdpbmFsdSRgJGJgLHNlcCA9ICIiKSxOQSkpDQoNCnphX3R5dHVsX29yeWdpbmFsdSA8LSB6YV90eXR1bF9vcnlnaW5hbHVbb3JkZXIoemFfdHl0dWxfb3J5Z2luYWx1JGxpY3puaWssemFfdHl0dWxfb3J5Z2luYWx1JHR5dHVsKSxdDQp6YV90eXR1bF9vcnlnaW5hbHUgJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSB9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiB6YV90eXR1bF9vcnlnaW5hbHUkc2FtZQ0KemFfdHl0dWxfb3J5Z2luYWx1JHNhbWVbMV0gPC0gMA0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIHphX3R5dHVsX29yeWdpbmFsdSAlPiUNCiAgZmlsdGVyKHNhbWU9PTApICU+JQ0KICBzZWxlY3QoLWxlbmd0aCh6YV90eXR1bF9vcnlnaW5hbHUpKQ0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIHphX3R5dHVsX29yeWdpbmFsdSAlPiUNCiAgc2VsZWN0KDEsNSkNCg0KemFfdHl0dWxfb3J5Z2luYWx1JHR5dHVsIDwtIGdzdWIoIihbYS16xJnDs8SFxZvFgsW8xbrEh8WEXSkoICkoOikoIHswLDF9KShcXCh7MCwxfSkoW2EtesSZw7PEhcWbxYLFvMW6xIfFhEEtWsSYw5PEhMWaxYHFu8W5xIbFg10pKC4pIiwiXFwxLlxcMlxcVVxcNVxcNlxcRVxcNyIscGVybCA9IFRSVUUsIHphX3R5dHVsX29yeWdpbmFsdSR0eXR1bCkNCnphX3R5dHVsX29yeWdpbmFsdSR0eXR1bCA8LSBnc3ViKCIoICkoOikoIHswLDF9W2Etel0pKC4pIiwiXFwxXFxVXFwzXFxFXFw0IixwZXJsID0gVFJVRSwgemFfdHl0dWxfb3J5Z2luYWx1JHR5dHVsKQ0KemFfdHl0dWxfb3J5Z2luYWx1JHR5dHVsIDwtIHN0cl9yZXBsYWNlKHphX3R5dHVsX29yeWdpbmFsdSR0eXR1bCwgIihbXlxcLl0pKFxcLiQpIiwiXFwxIikNCiMxNg0KbWFyY19maWVsZCA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5payxYMDQxKQ0KbWFyY19maWVsZCRYMDQxPC1zdHJfcmVtb3ZlX2FsbChtYXJjX2ZpZWxkJFgwNDEsIl5cXHwiKQ0KbWFyY19maWVsZCA8LSBtdXRhdGUobWFyY19maWVsZCwNCiAgICAgICAgICAgICAgIGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChtYXJjX2ZpZWxkJFgwNDEsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMDQxLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGQpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCg0KbWFyY19maWVsZDwtY2JpbmQobWFyY19maWVsZCxlbXB0eV90YWJsZSkNCg0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgbWFyY19maWVsZCRYMDQxIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGQkWDA0MSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KfQ0KZm9yIChpIGluIHgpIHsNCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0Kc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQpzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQpzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQpzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQptYXJjX2ZpZWxkWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGQkWDA0MSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGQkWDA0MSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSAgDQp9DQp6YV9qZXp5a19vcnlnaW5hbHUgPC0gbWFyY19maWVsZCAlPiUNCiAgc2VsZWN0KGxpY3puaWssamV6eWtfb3J5Z2luYWx1ID0gYCRhYCkNCnphX2plenlrX29yeWdpbmFsdSRqZXp5a19vcnlnaW5hbHUgPC0gc3RyX3JlcGxhY2VfYWxsKHphX2plenlrX29yeWdpbmFsdSRqZXp5a19vcnlnaW5hbHUsIlxcJGEiLCJ8IikNCiMxNw0KQk5fd3Nwb2x0d29yY2EgPC0gZGF0YS5mcmFtZSh3c3BvbHR3b3JjYSA9IHN0cl9yZW1vdmVfYWxsKGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCIoPzw9OyApKC4qKSg/PSQpIikpLCJcXC4kIiksIGxpY3puaWsgPSBkYXRhJGxpY3puaWspDQpCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYSA8LSBzdHJfcmVtb3ZlX2FsbChCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYSwiIGV0IGFsXFwuIikNCkJOX3dzcG9sdHdvcmNhIDwtIG11dGF0ZShCTl93c3BvbHR3b3JjYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBmdW5rY2phID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYSwiKD88PVxcWykoLio/KSg/PSBbQS1aw5PFmsWBxbvFucSGxYNdKSIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBvc19pbWllID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYSwiKD88PSApKC4qKSg/PSAoPyEuKiApKSIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBvc19uYXp3aXNrbyA9IHN0cl9yZXBsYWNlX2FsbChCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYSwiKC4qKSggKD8hLiogKSkoLiopKFxcXSkiLCAiXFwzIikpDQoNCndzX3Byb3N0eSA8LSBwYXN0ZShCTl93c3BvbHR3b3JjYSRvc19uYXp3aXNrbyxCTl93c3BvbHR3b3JjYSRvc19pbWllKQ0Kd3NfcHJvc3R5IDwtIHVubGlzdCh3c19wcm9zdHkpDQp3c19wcm9zdHkgPC0gc3RyX3RvX2xvd2VyKHdzX3Byb3N0eSkNCndzX3Byb3N0eSA8LSBzdHJfcmVwbGFjZV9hbGwod3NfcHJvc3R5LCAiXFxXIiwgIiIpDQp3c19wcm9zdHkgPC0gbGlzdCh3c19wcm9zdHkpDQp3c19wcm9zdHkgPC0gZGF0YS5mcmFtZSh3c19wcm9zdHkpDQpjb2xuYW1lcyh3c19wcm9zdHkpIDwtICJuYXp3YSINCg0KZnVfcHJvc3RhIDwtIEJOX3dzcG9sdHdvcmNhJGZ1bmtjamENCmZ1X3Byb3N0YSA8LSB1bmxpc3QoZnVfcHJvc3RhKQ0KZnVfcHJvc3RhIDwtIHN0cl90b19sb3dlcihmdV9wcm9zdGEpDQpmdV9wcm9zdGEgPC0gc3RyX3JlcGxhY2VfYWxsKGZ1X3Byb3N0YSwgIlxcVyIsICIiKQ0KZnVfcHJvc3RhIDwtIGxpc3QoZnVfcHJvc3RhKQ0KZnVfcHJvc3RhIDwtIGRhdGEuZnJhbWUoZnVfcHJvc3RhKQ0KY29sbmFtZXMoZnVfcHJvc3RhKSA8LSAibmF6d2EiDQoNCndzX0JOIDwtIGRhdGEuZnJhbWUobGljem5payA9IEJOX3dzcG9sdHdvcmNhJGxpY3puaWssIG9zX25hendpc2tvID0gQk5fd3Nwb2x0d29yY2Ekb3NfbmF6d2lza28sIG9zX2ltaWUgPSBCTl93c3BvbHR3b3JjYSRvc19pbWllLCBuYXp3YV9wcm9zdGEgPSB3c19wcm9zdHkkbmF6d2EsIGZ1bmtjamEgPSBCTl93c3BvbHR3b3JjYSRmdW5rY2phLCBuYXp3YSA9IGZ1X3Byb3N0YSRuYXp3YSkNCg0KQk5fUEJMX3dzcG9sdHdvcmN5IDwtIG1lcmdlKHggPSB3c19CTiwgeSA9IFBCTF93c3BvbHR3b3JjeSwgYnkgPSAnbmF6d2FfcHJvc3RhJywgc29ydCA9IEZBTFNFLCBhbGwueCA9IFRSVUUpDQoNCkJOX1BCTF93c3BvbHR3b3JjeSA8LSBtZXJnZSh4ID0gQk5fUEJMX3dzcG9sdHdvcmN5LCB5ID0gUEJMX2Z1bmtjamUsIGJ5ID0gJ25hendhJywgc29ydCA9IEZBTFNFLCBhbGwueCA9IFRSVUUpDQoNCkJOX1BCTF93c3BvbHR3b3JjeSA8LSBCTl9QQkxfd3Nwb2x0d29yY3lbb3JkZXIoYXMuaW50ZWdlcihhcy5jaGFyYWN0ZXIoQk5fUEJMX3dzcG9sdHdvcmN5JGxpY3puaWspKSksXQ0KDQojbmF6d2lza28NCg0KYl9vc19uYXp3aXNrbyA8LSBkYXRhLmZyYW1lKG9zX25hendpc2tvID0gaWZlbHNlKGlzLm5hKEJOX1BCTF93c3BvbHR3b3JjeSRPU19PU09CQV9JRCksIGFzLmNoYXJhY3RlcihCTl9QQkxfd3Nwb2x0d29yY3kkb3NfbmF6d2lza28pLCBOQSkpDQpiX29zX2ltaWUgPC0gZGF0YS5mcmFtZShvc19pbWllID0gaWZlbHNlKGlzLm5hKEJOX1BCTF93c3BvbHR3b3JjeSRPU19PU09CQV9JRCksIGFzLmNoYXJhY3RlcihCTl9QQkxfd3Nwb2x0d29yY3kkb3NfaW1pZSksIE5BKSkNCg0KQk5fUEJMX29zb2J5X2Z1bmtjamUgPC0gZGF0YS5mcmFtZShsaWN6bmlrID0gQk5fUEJMX3dzcG9sdHdvcmN5JGxpY3puaWssIG9zX29zb2JhX2lkID0gQk5fUEJMX3dzcG9sdHdvcmN5JE9TX09TT0JBX0lELCBiX29zX25hendpc2tvLCBiX29zX2ltaWUsIGZvX3N5bWJvbCA9IEJOX1BCTF93c3BvbHR3b3JjeSRmb19zeW1ib2wsIGZvX25hendhID0gQk5fUEJMX3dzcG9sdHdvcmN5JGZvX25hendhICkNCg0KIzIyDQp6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSBkYXRhLmZyYW1lKHphX29waXNfd3Nwb2x0d29yY293ID0gZ3N1YigiKFxcWykoLikoLiopIiwgIlxcMVxcVVxcMlxcRVxcMyIsIHBlcmwgPSBUUlVFLCBCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYSksIGxpY3puaWsgPSBkYXRhJGxpY3puaWspDQoNCiMyMw0KemFfd3lkYW5pZSA8LSBkYXRhLmZyYW1lKGRhdGEkWDI1MCkNCnphX3d5ZGFuaWUgPC0gZGF0YS5mcmFtZShzdHJfcmVwbGFjZV9hbGwoemFfd3lkYW5pZVssMV0sICJcXCRhV3lkXFwuICIsIiIpKQ0KemFfd3lkYW5pZSA8LSBkYXRhLmZyYW1lKHN0cl9yZXBsYWNlX2FsbCh6YV93eWRhbmllWywxXSwgIi5cXCQuKiIsIiIpKQ0KemFfd3lkYW5pZSA8LSBkYXRhLmZyYW1lKHN0cl9yZXBsYWNlX2FsbCh6YV93eWRhbmllWywxXSwgIihcXGQpKFxcLiQpIiwiXFwxIikpDQp6YV93eWRhbmllIDwtIGNiaW5kKHphX3d5ZGFuaWUsIDE6bGVuZ3Rocyh6YV93eWRhbmllKSkNCmNvbG5hbWVzKHphX3d5ZGFuaWUpIDwtIGMoInphX3d5ZGFuaWUiLCAibGljem5payIpDQojMjQNCm1hcmNfZmllbGQgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KGxpY3puaWssWDI0NSkNCm1hcmNfZmllbGQkWDI0NTwtc3RyX3JlcGxhY2VfYWxsKG1hcmNfZmllbGQkWDI0NSwiKF58XFx8KSIsIn5cXDEiKQ0KbWFyY19maWVsZDwtIGNTcGxpdChtYXJjX2ZpZWxkLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKQ0KbWFyY19maWVsZDwtIG1hcmNfZmllbGQlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKQ0KbWFyY19maWVsZCRYMjQ1PC1zdHJfcmVtb3ZlX2FsbChtYXJjX2ZpZWxkJFgyNDUsIl5cXHwiKQ0KbWFyY19maWVsZCA8LSBtdXRhdGUobWFyY19maWVsZCwNCiAgICAgICAgICAgICAgIGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChtYXJjX2ZpZWxkJFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGQpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCg0KbWFyY19maWVsZDwtY2JpbmQobWFyY19maWVsZCxlbXB0eV90YWJsZSkNCg0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgbWFyY19maWVsZCRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGQkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KfQ0KZm9yIChpIGluIHgpIHsNCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0Kc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQpzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQpzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQpzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQptYXJjX2ZpZWxkWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGQkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGQkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSAgDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZCAlPiUNCiAgc2VsZWN0KGxpY3puaWssIFgyNDUgPSBgJGNgKQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamFbb3JkZXIoemFfaW5zdHl0dWNqYSRsaWN6bmlrLHphX2luc3R5dHVjamEkWDI0NSksXQ0KemFfaW5zdHl0dWNqYSAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpIH0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IHphX2luc3R5dHVjamEkc2FtZQ0KemFfaW5zdHl0dWNqYSRzYW1lWzFdIDwtIDANCnphX2luc3R5dHVjamEgPC0gemFfaW5zdHl0dWNqYSAlPiUNCiAgZmlsdGVyKHNhbWU9PTApICU+JQ0KICBzZWxlY3QoLWxlbmd0aCh6YV9pbnN0eXR1Y2phKSkNCg0KemFfaW5zdHl0dWNqYSA8LSBtdXRhdGUoemFfaW5zdHl0dWNqYSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3R5dHVjamEgPSBpZmVsc2UoZ3JlcGwoIlxcOyIsemFfaW5zdHl0dWNqYSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoemFfaW5zdHl0dWNqYSRYMjQ1LCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpDQoNCnphX2luc3R5dHVjamEgPC0gbWVyZ2UoeD16YV9pbnN0eXR1Y2phLHk9Qk5fUEJMX3dzcG9sdHdvcmN5LGJ5ID0gImxpY3puaWsiLGFsbC54ID0gVFJVRSkNCnphX2luc3R5dHVjamEgPC0gemFfaW5zdHl0dWNqYSAlPiUNCiAgc2VsZWN0KDEsMiwzLDYsNykNCnphX2luc3R5dHVjamEgPC0gbXV0YXRlKHphX2luc3R5dHVjamEsDQogICAgICAgICAgICAgICAgICAgICAgICBjenlfbmF6ID0gc3RyX2RldGVjdCh6YV9pbnN0eXR1Y2phJFgyNDUsYXMuY2hhcmFjdGVyKHphX2luc3R5dHVjamEkb3NfbmF6d2lza28pKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGN6eV9pbSA9IHN0cl9kZXRlY3QoemFfaW5zdHl0dWNqYSRYMjQ1LGFzLmNoYXJhY3Rlcih6YV9pbnN0eXR1Y2phJG9zX2ltaWUpKSkNCnRlc3QgPC0gemFfaW5zdHl0dWNqYSAlPiUNCiAgZmlsdGVyKGlzLm5hKGN6eV9uYXopJmlzLm5hKGN6eV9pbSkpICU+JQ0KICBmaWx0ZXIoaW5zdHl0dWNqYSE9IiIpICU+JQ0KICBmaWx0ZXIoIShncmVwbCgiXlxcW1thLXrEmcOzxIXFm8WCxbzFusSHxYRdfF5bYS16xJnDs8SFxZvFgsW8xbrEh8WEXSIsaW5zdHl0dWNqYSkpKSAlPiUNCiAgc2VsZWN0KGxpY3puaWssaW5zdHl0dWNqYSkNCnRlc3QkaW5zdHl0dWNqYSA8LSBzdHJfcmVtb3ZlKHRlc3QkaW5zdHl0dWNqYSwiKD88PVthLXrEmcOzxIXFm8WCxbzFusSHxYRdKShcXC4kKSIpDQp6YV9pbnN0eXR1Y2phIDwtIHRlc3QNCnRlc3QgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KGxpY3puaWspDQp6YV9pbnN0eXR1Y2phIDwtIG1lcmdlKHg9emFfaW5zdHl0dWNqYSx5PXRlc3QsYnkgPSAibGljem5payIsIGFsbCA9IFRSVUUpDQojMjUNCkJOX3d5ZGF3bmljdHdvIDwtIGRhdGEuZnJhbWUoWDI2MCA9IGRhdGEkWDI2MCwgbGljem5payA9IGRhdGEkbGljem5paykNCkJOX3d5ZGF3bmljdHdvJFgyNjAgPC0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJFgyNjAsInNcXC5uXFwuIiwgImIudy4iKQ0KQk5fd3lkYXduaWN0d28kWDI2MCA8LSBzdHJfcmVwbGFjZV9hbGwoQk5fd3lkYXduaWN0d28kWDI2MCwic1xcLmxcXC4iLCAiYi5tLiIpDQpCTl93eWRhd25pY3R3byRYMjYwIDwtIHN0cl9yZXBsYWNlX2FsbChCTl93eWRhd25pY3R3byRYMjYwLCJTXFwubFxcLiIsICJiLm0uIikNCkJOX3d5ZGF3bmljdHdvJFgyNjAgPC0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJFgyNjAsIlxcJGYiLCAiJGMiKQ0KQk5fd3lkYXduaWN0d28kWDI2MCA8LSBzdHJfcmVtb3ZlKEJOX3d5ZGF3bmljdHdvJFgyNjAsIl5cXFxcKyIpDQojcsSZY3puaWUgd3lnZW5lcm93YcSHIGkgbmFwcmF3acSHIGLFgsSFZCAiOiRhIiAtIHBvd2lubm8gYnnEhyBhbGJvIDskYSwgYWxibyA6JGINCnRlc3QgPC0gbXV0YXRlKEJOX3d5ZGF3bmljdHdvLA0KICAgICAgICAgICAgICAgZHd1ayA9IHN0cl9kZXRlY3QoQk5fd3lkYXduaWN0d28kWDI2MCwiXFw6XFwkYSIpKQ0KdGVzdCA8LSB0ZXN0ICU+JQ0KICBmaWx0ZXIoZHd1az09VFJVRSkNCiNCTl93eWRhd25pY3R3byRYMjYwW0JOX3d5ZGF3bmljdHdvJFgyNjA9PSIkYUtyYWvDs3cgOiRiQ29sbGVnaXVtIENvbHVtYmludW0gOyRhV2Fyc3phd2EgOiRhVG93YXJ6eXN0d28gQmFkYcWEIG5hZCBXaWVraWVtIE9zaWVtbmFzdHltLCRjY29wLiAyMDA2LiJdIDwtICIkYUtyYWvDs3cgOiRiQ29sbGVnaXVtIENvbHVtYmludW0gOyRhV2Fyc3phd2EgOiRiVG93YXJ6eXN0d28gQmFkYcWEIG5hZCBXaWVraWVtIE9zaWVtbmFzdHltLCRjY29wLiAyMDA2LiINCg0KQk5fd3lkYXduaWN0d28gPC0gbXV0YXRlKEJOX3d5ZGF3bmljdHdvLA0KICAgICAgICAgICAgICAgICAgICAgIHJva193eWRhbmlhID0gc3RyX2V4dHJhY3RfYWxsKEJOX3d5ZGF3bmljdHdvJFgyNjAsICIoPzw9XFwkYykuKig/PVxcJGUpfCg/PD1cXCRjKS4qIiksDQogICAgICAgICAgICAgICAgICAgICAgYmV6X3Jva3UgPSBzdHJfcmVwbGFjZV9hbGwoQk5fd3lkYXduaWN0d28kWDI2MCwgIi5cXCRjLioiLCAiIikpDQoNCkJOX3d5ZGF3bmljdHdvJGJlel9yb2t1IDwtIHN0cl9yZXBsYWNlX2FsbChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpDQpCTl93eWRhd25pY3R3byA8LSBtdXRhdGUoQk5fd3lkYXduaWN0d28sDQogICAgICAgICAgICAgICAgICAgICAgaWxlX3d5ZGF3bmljdHcgPSBzdHJfY291bnQoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsICJcXCRiIiksDQogICAgICAgICAgICAgICAgICAgICAgaWxlX21pZWpzYyA9IHN0cl9jb3VudChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwgIlxcJGEiKSwNCiAgICAgICAgICAgICAgICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVtb3ZlKHN0cl9yZXBsYWNlX2FsbChhcy5jaGFyYWN0ZXIoc3RyX2V4dHJhY3RfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCAiXFwkLiIpKSwgIlteYS16XSIsICIiKSwiXmMiKSwNCiAgICAgICAgICAgICAgICAgICAgICBwb2R6aWVsb25lID0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCIoXFwkLikiLCJ8XFwxfiIpKQ0KDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lIDwtIHN0cl9yZW1vdmUoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSwiXlxcfCIpDQpCTl93eWRhd25pY3R3byRrb2xlam5vc2MgPC0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJGtvbGVqbm9zYywiKC4pIiwiXFwxfCIpDQpCTl93eWRhd25pY3R3byRrb2xlam5vc2MgPC0gc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byRrb2xlam5vc2MsIlxcfCQiKQ0KQk5fd3lkYXduaWN0d28gPC0gY1NwbGl0KEJOX3d5ZGF3bmljdHdvLGMoImtvbGVqbm9zYyIsInBvZHppZWxvbmUiKSwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpDQoNCkJOX3d5ZGF3bmljdHdvICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgJiBrb2xlam5vc2MgPT0gZHBseXI6OmxhZyhrb2xlam5vc2MsIDEpIH0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IEJOX3d5ZGF3bmljdHdvJHNhbWUNCkJOX3d5ZGF3bmljdHdvJHNhbWVbMV0gPC0gMA0KQk5fd3lkYXduaWN0d28kcm9rX3d5ZGFuaWEgPC0gYXMuY2hhcmFjdGVyKEJOX3d5ZGF3bmljdHdvJHJva193eWRhbmlhKQ0KQk5fd3lkYXduaWN0d28kbHAgPC0gMTpsZW5ndGhzKEJOX3d5ZGF3bmljdHdvKQ0KcGllcndzemUgPC0gQk5fd3lkYXduaWN0d28gJT4lDQogIGZpbHRlcihzYW1lPT0wKQ0KZHJ1Z2llIDwtIEJOX3d5ZGF3bmljdHdvICU+JQ0KICBmaWx0ZXIoc2FtZT09MSkNCmRydWdpZSA8LSBkZHBseShkcnVnaWUsIC4oWDI2MCwgbGljem5paywgcm9rX3d5ZGFuaWEsIGJlel9yb2t1LCBpbGVfd3lkYXduaWN0dywgaWxlX21pZWpzYywga29sZWpub3NjLCBzYW1lKSwgc3VtbWFyaXplLCBwb2R6aWVsb25lID0gcGFzdGUocG9kemllbG9uZSwgY29sbGFwc2U9IiIpLCBscCA9IHBhc3RlKGxwLCBjb2xsYXBzZT0ifCIpKQ0KQk5fd3lkYXduaWN0d28gPC0gcmJpbmQocGllcndzemUsZHJ1Z2llKQ0KQk5fd3lkYXduaWN0d28kbHAgPC0gc3RyX3JlcGxhY2UoQk5fd3lkYXduaWN0d28kbHAsIiguKj8pKFxcfCkoLiokKSIsIlxcMSIpDQpCTl93eWRhd25pY3R3byRscCA8LSBhcy5pbnRlZ2VyKEJOX3d5ZGF3bmljdHdvJGxwKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bb3JkZXIoQk5fd3lkYXduaWN0d28kbGljem5payxCTl93eWRhd25pY3R3byRscCksXQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d28gJT4lDQogIHNlbGVjdCgtbHApDQpCTl93eWRhd25pY3R3byAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpICYga29sZWpub3NjID09ICJiIiAmIGtvbGVqbm9zYyA9PSBkcGx5cjo6bGVhZChrb2xlam5vc2MsIDEpIH0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IEJOX3d5ZGF3bmljdHdvJHNhbWUyDQpCTl93eWRhd25pY3R3byRzYW1lMltsZW5ndGgoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSldIDwtIDANCg0KQk5fd3lkYXduaWN0d28kcG9kemllbG9uZTIgPC0gbGFnKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsbj0xKQ0KQk5fd3lkYXduaWN0d28gJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSAmIGtvbGVqbm9zYyA9PSAiYSIgJiBrb2xlam5vc2MgPT0gZHBseXI6OmxhZyhrb2xlam5vc2MsIDEpIH0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IEJOX3d5ZGF3bmljdHdvJHNhbWVfYQ0KQk5fd3lkYXduaWN0d28kc2FtZV9hWzFdIDwtIDANCg0KQk5fd3lkYXduaWN0d28kcG9kemllbG9uZTMgPC0gbGVhZChCTl93eWRhd25pY3R3byRwb2R6aWVsb25lLG49MSkNCkJOX3d5ZGF3bmljdHdvJHNhbWVfYTIgPC0gbGVhZChCTl93eWRhd25pY3R3byRzYW1lX2Esbj0xKQ0KQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSA8LSBpZmVsc2UoQk5fd3lkYXduaWN0d28kc2FtZV9hMj09MSxwYXN0ZShCTl93eWRhd25pY3R3byRwb2R6aWVsb25lLEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUzLHNlcCA9ICIiKSxhcy5jaGFyYWN0ZXIoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSkpDQpCTl93eWRhd25pY3R3byA8LSBCTl93eWRhd25pY3R3byAlPiUNCiAgZmlsdGVyKHNhbWVfYT09MCkNCkJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUyIDwtIGxhZyhCTl93eWRhd25pY3R3byRwb2R6aWVsb25lLG49MSkNCg0KQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSA8LSBpZmVsc2UoQk5fd3lkYXduaWN0d28kc2FtZT09MCZCTl93eWRhd25pY3R3byRzYW1lMj09MSxwYXN0ZShCTl93eWRhd25pY3R3byRwb2R6aWVsb25lLEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUyLHNlcCA9ICJ8IiksYXMuY2hhcmFjdGVyKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUpKQ0KQk5fd3lkYXduaWN0d28gPC0gY1NwbGl0KEJOX3d5ZGF3bmljdHdvLCJwb2R6aWVsb25lIiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpDQpCTl93eWRhd25pY3R3byRiZXpfcm9rdSA8LSBCTl93eWRhd25pY3R3byRwb2R6aWVsb25lDQpCTl93eWRhd25pY3R3byA8LSBCTl93eWRhd25pY3R3byAlPiUNCiAgc2VsZWN0KGxpY3puaWsscm9rX3d5ZGFuaWEsWDI2MCxiZXpfcm9rdSkNCkJOX3d5ZGF3bmljdHdvJHJva193eWRhbmlhIDwtIGFzLmNoYXJhY3RlcihCTl93eWRhd25pY3R3byRyb2tfd3lkYW5pYSkNCkJOX3d5ZGF3bmljdHdvIDwtIGRkcGx5KEJOX3d5ZGF3bmljdHdvLCAuKGxpY3puaWssIHJva193eWRhbmlhLCBYMjYwKSwgc3VtbWFyaXplLCBiZXpfcm9rdSA9IHBhc3RlKGJlel9yb2t1LCBjb2xsYXBzZT0iIikpDQpCTl93eWRhd25pY3R3byRiZXpfcm9rdSA8LSBzdHJfcmVtb3ZlX2FsbChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwiXFx+IikNCiNkcnVnaSByYXoNCkJOX3d5ZGF3bmljdHdvJGJlel9yb2t1IDwtIHN0cl9yZXBsYWNlX2FsbChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpDQpCTl93eWRhd25pY3R3byA8LSBtdXRhdGUoQk5fd3lkYXduaWN0d28sDQogICAgICAgICAgICAgICAgICAgICAgaWxlX3d5ZGF3bmljdHcgPSBzdHJfY291bnQoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsICJcXCRiIiksDQogICAgICAgICAgICAgICAgICAgICAgaWxlX21pZWpzYyA9IHN0cl9jb3VudChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwgIlxcJGEiKSwNCiAgICAgICAgICAgICAgICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVtb3ZlKHN0cl9yZXBsYWNlX2FsbChhcy5jaGFyYWN0ZXIoc3RyX2V4dHJhY3RfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCAiXFwkLiIpKSwgIlteYS16XSIsICIiKSwiXmMiKSwNCiAgICAgICAgICAgICAgICAgICAgICBwb2R6aWVsb25lID0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJGJlel9yb2t1LCIoXFwkLikiLCJ8XFwxfiIpKQ0KDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lIDwtIHN0cl9yZW1vdmUoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSwiXlxcfCIpDQpCTl93eWRhd25pY3R3byRrb2xlam5vc2MgPC0gc3RyX3JlcGxhY2VfYWxsKEJOX3d5ZGF3bmljdHdvJGtvbGVqbm9zYywiKC4pIiwiXFwxfCIpDQpCTl93eWRhd25pY3R3byRrb2xlam5vc2MgPC0gc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byRrb2xlam5vc2MsIlxcfCQiKQ0KQk5fd3lkYXduaWN0d28gPC0gY1NwbGl0KEJOX3d5ZGF3bmljdHdvLGMoImtvbGVqbm9zYyIsInBvZHppZWxvbmUiKSwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpDQpCTl93eWRhd25pY3R3byA8LSBCTl93eWRhd25pY3R3byAlPiUNCiAgZmlsdGVyKCFpcy5uYShwb2R6aWVsb25lKSkNCg0KQk5fd3lkYXduaWN0d28gJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSAmIGtvbGVqbm9zYyA9PSBkcGx5cjo6bGFnKGtvbGVqbm9zYywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gQk5fd3lkYXduaWN0d28kc2FtZQ0KQk5fd3lkYXduaWN0d28kc2FtZVsxXSA8LSAwDQoNCkJOX3d5ZGF3bmljdHdvICUkJSAgDQogICAgeyBsaWN6bmlrID09IGRwbHlyOjpsYWcobGljem5paywgMSkgJiBrb2xlam5vc2MgPT0gImIiICYga29sZWpub3NjID09IGRwbHlyOjpsZWFkKGtvbGVqbm9zYywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gQk5fd3lkYXduaWN0d28kc2FtZTINCkJOX3d5ZGF3bmljdHdvJHNhbWUyW2xlbmd0aChCTl93eWRhd25pY3R3byRwb2R6aWVsb25lKV0gPC0gMA0KDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lMiA8LSBsYWcoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSxuPTEpDQpCTl93eWRhd25pY3R3byAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpICYga29sZWpub3NjID09ICJhIiAmIGtvbGVqbm9zYyA9PSBkcGx5cjo6bGFnKGtvbGVqbm9zYywgMSkgfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gQk5fd3lkYXduaWN0d28kc2FtZV9hDQpCTl93eWRhd25pY3R3byRzYW1lX2FbMV0gPC0gMA0KDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lMyA8LSBsZWFkKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsbj0xKQ0KQk5fd3lkYXduaWN0d28kc2FtZV9hMiA8LSBsZWFkKEJOX3d5ZGF3bmljdHdvJHNhbWVfYSxuPTEpDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lIDwtIGlmZWxzZShCTl93eWRhd25pY3R3byRzYW1lX2EyPT0xLHBhc3RlKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsQk5fd3lkYXduaWN0d28kcG9kemllbG9uZTMsc2VwID0gIiIpLGFzLmNoYXJhY3RlcihCTl93eWRhd25pY3R3byRwb2R6aWVsb25lKSkNCkJOX3d5ZGF3bmljdHdvIDwtIEJOX3d5ZGF3bmljdHdvICU+JQ0KICBmaWx0ZXIoc2FtZV9hPT0wKQ0KQk5fd3lkYXduaWN0d28kcG9kemllbG9uZTIgPC0gbGFnKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsbj0xKQ0KDQpCTl93eWRhd25pY3R3byRwb2R6aWVsb25lIDwtIGlmZWxzZShCTl93eWRhd25pY3R3byRzYW1lPT0wJkJOX3d5ZGF3bmljdHdvJHNhbWUyPT0xLHBhc3RlKEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUsQk5fd3lkYXduaWN0d28kcG9kemllbG9uZTIsc2VwID0gInwiKSxhcy5jaGFyYWN0ZXIoQk5fd3lkYXduaWN0d28kcG9kemllbG9uZSkpDQpCTl93eWRhd25pY3R3byA8LSBjU3BsaXQoQk5fd3lkYXduaWN0d28sInBvZHppZWxvbmUiLCBzZXAgPSAifCIsIGRpcmVjdGlvbiA9ICJsb25nIikNCkJOX3d5ZGF3bmljdHdvJGJlel9yb2t1IDwtIEJOX3d5ZGF3bmljdHdvJHBvZHppZWxvbmUNCkJOX3d5ZGF3bmljdHdvIDwtIEJOX3d5ZGF3bmljdHdvICU+JQ0KICBzZWxlY3QobGljem5payxyb2tfd3lkYW5pYSxYMjYwLGJlel9yb2t1KQ0KQk5fd3lkYXduaWN0d28kcm9rX3d5ZGFuaWEgPC0gYXMuY2hhcmFjdGVyKEJOX3d5ZGF3bmljdHdvJHJva193eWRhbmlhKQ0KQk5fd3lkYXduaWN0d28kY3p5IDwtIHN0cl9kZXRlY3QoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsIlxcJGEiKQ0KQk5fd3lkYXduaWN0d28kYmV6X3Jva3UgPC0gaWZlbHNlKEJOX3d5ZGF3bmljdHdvJGN6eT09VFJVRSxwYXN0ZSgifCIsQk5fd3lkYXduaWN0d28kYmV6X3Jva3Usc2VwID0gIiIpLGFzLmNoYXJhY3RlcihCTl93eWRhd25pY3R3byRiZXpfcm9rdSkpDQpCTl93eWRhd25pY3R3byA8LSBkZHBseShCTl93eWRhd25pY3R3bywgLihsaWN6bmlrLCByb2tfd3lkYW5pYSwgWDI2MCksIHN1bW1hcml6ZSwgYmV6X3Jva3UgPSBwYXN0ZShiZXpfcm9rdSwgY29sbGFwc2U9IiIpKQ0KQk5fd3lkYXduaWN0d28kYmV6X3Jva3UgPC0gc3RyX3JlbW92ZV9hbGwoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsIlxcfiIpDQpCTl93eWRhd25pY3R3byRiZXpfcm9rdSA8LSBzdHJfcmVtb3ZlX2FsbChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwiXlxcfCIpDQoNCkJOX3d5ZGF3bmljdHdvIDwtIGNTcGxpdChCTl93eWRhd25pY3R3bywgImJlel9yb2t1Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpDQpCTl93eWRhd25pY3R3byA8LSBtdXRhdGUoQk5fd3lkYXduaWN0d28sDQogICAgICAgICAgICAgICAgICB3eWRhd25pY3R3byA9IHN0cl9leHRyYWN0X2FsbChCTl93eWRhd25pY3R3byRiZXpfcm9rdSwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgICAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UsICIoPzw9XFwkYSkoLiopKD89IHswLDF9OiB7MCwxfVxcJGIpfCg/PD1cXCRhKSguKikoJCkiKSwiIDtcXCRhIiwgIiwgIiksDQogICAgICAgICAgICAgICAgICBuYXp3YV9wcm9zdGEgPSBzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbCh1bmxpc3QoQk5fd3lkYXduaWN0d28kYmV6X3Jva3UpLCAiXFwkXFx3IiwgIiIpLCAiXFxXIiwgIiIpKSwNCiAgICAgICAgICAgICAgICAgIGxwID0gMTpsZW5ndGhzKEJOX3d5ZGF3bmljdHdvKSkNCkJOX3d5ZGF3bmljdHdvJHd5ZGF3bmljdHdvIDwtIHN0cl9yZW1vdmUoQk5fd3lkYXduaWN0d28kd3lkYXduaWN0d28sIlxccytcXDskIikNCkJOX3d5ZGF3bmljdHdvJHd5ZGF3bmljdHdvIDwtIHN0cl9yZW1vdmUoQk5fd3lkYXduaWN0d28kd3lkYXduaWN0d28sIlxccytcXDokIikNCg0KQk5fd3lkYXduaWN0d28kbWllanNjZV93eWRhbmlhIDwtIHN0cl9yZW1vdmUoQk5fd3lkYXduaWN0d28kbWllanNjZV93eWRhbmlhLCIgXFxbezAsMTB9ZXRjXFwuezAsMTB9XFxdXFxzezAsMTB9JCIpDQpCTl93eWRhd25pY3R3byRtaWVqc2NlX3d5ZGFuaWEgPC0gc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byRtaWVqc2NlX3d5ZGFuaWEsIiBcXFt7MCwxMH1ldGNcXC57MCwxMH1cXHN7MCwxMH0kIikNCkJOX3d5ZGF3bmljdHdvJG1pZWpzY2Vfd3lkYW5pYSA8LSBpZmVsc2UoZ3JlcGwoIlxcWyIsQk5fd3lkYXduaWN0d28kbWllanNjZV93eWRhbmlhKSYhZ3JlcGwoIlxcXSIsQk5fd3lkYXduaWN0d28kbWllanNjZV93eWRhbmlhKSxzdHJfcmVtb3ZlKEJOX3d5ZGF3bmljdHdvJG1pZWpzY2Vfd3lkYW5pYSwiXFxbIiksYXMuY2hhcmFjdGVyKEJOX3d5ZGF3bmljdHdvJG1pZWpzY2Vfd3lkYW5pYSkpDQpCTl93eWRhd25pY3R3byR3eWRhd25pY3R3byA8LSBpZmVsc2UoZ3JlcGwoIlxcXSIsQk5fd3lkYXduaWN0d28kd3lkYXduaWN0d28pJiFncmVwbCgiXFxbIixCTl93eWRhd25pY3R3byR3eWRhd25pY3R3byksc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byR3eWRhd25pY3R3bywiXFxdIiksYXMuY2hhcmFjdGVyKEJOX3d5ZGF3bmljdHdvJHd5ZGF3bmljdHdvKSkNCkJOX1BCTF93eWRhd25pY3R3YSA8LSBtZXJnZSggeCA9IEJOX3d5ZGF3bmljdHdvLCB5ID0gUEJMX3d5ZGF3bmljdHdhLCBieSA9ICduYXp3YV9wcm9zdGEnLCBzb3J0ID0gRkFMU0UsIGFsbC54ID0gVFJVRSwgYWxsb3cuY2FydGVzaWFuID0gVFJVRSkNCkJOX1BCTF93eWRhd25pY3R3YSR0b19zYW1vIDwtIEJOX1BCTF93eWRhd25pY3R3YSR3eWRhd25pY3R3bz09Qk5fUEJMX3d5ZGF3bmljdHdhJFdZX05BWldBDQpCTl9QQkxfd3lkYXduaWN0d2EgPC0gQk5fUEJMX3d5ZGF3bmljdHdhW29yZGVyKGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKEJOX1BCTF93eWRhd25pY3R3YSRsaWN6bmlrKSksIC1CTl9QQkxfd3lkYXduaWN0d2EkdG9fc2FtbywgLUJOX1BCTF93eWRhd25pY3R3YSRXWV9MSUNaQkFfWkFQSVNPVyksXQ0KDQpCTl9QQkxfd3lkYXduaWN0d2EgJSQlICANCiAgICB7IGFzLmludGVnZXIobGljem5paykgPT0gZHBseXI6OmxhZyhhcy5pbnRlZ2VyKGxpY3puaWspLCAxKSAmIG5hendhX3Byb3N0YT09bGFnKG5hendhX3Byb3N0YSl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBCTl9QQkxfd3lkYXduaWN0d2Ekc2FtZQ0KQk5fUEJMX3d5ZGF3bmljdHdhJHNhbWVbMV0gPC0gMA0KDQpCTl9QQkxfd3lkYXduaWN0d2EgPC0gQk5fUEJMX3d5ZGF3bmljdHdhICU+JQ0KICBmaWx0ZXIoc2FtZT09MCkNCg0Kd3lfd3lkYXduaWN0d29faWQgPC0gQk5fUEJMX3d5ZGF3bmljdHdhICU+JQ0KICBzZWxlY3QobGljem5paywgV1lfV1lEQVdOSUNUV09fSUQpDQoNCnd5X3d5ZGF3bmljdHdvX2lkIDwtIHd5X3d5ZGF3bmljdHdvX2lkW29yZGVyKGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKHd5X3d5ZGF3bmljdHdvX2lkJGxpY3puaWspKSksXQ0KIzI2DQp3eV9taWVqc2NlIDwtIEJOX1BCTF93eWRhd25pY3R3YSAlPiUNCiAgc2VsZWN0KGxpY3puaWssIFdZX1dZREFXTklDVFdPX0lELG1pZWpzY2Vfd3lkYW5pYSkNCnd5X21pZWpzY2UkbWllanNjZV93eWRhbmlhIDwtIGlmZWxzZShpcy5uYSh3eV9taWVqc2NlJFdZX1dZREFXTklDVFdPX0lEKSxhcy5jaGFyYWN0ZXIod3lfbWllanNjZSRtaWVqc2NlX3d5ZGFuaWEpLCIiKQ0KDQojMjcNCnd5X25hendhIDwtIEJOX1BCTF93eWRhd25pY3R3YSAlPiUNCiAgc2VsZWN0KGxpY3puaWssIFdZX1dZREFXTklDVFdPX0lELHd5ZGF3bmljdHdvKQ0Kd3lfbmF6d2Ekd3lkYXduaWN0d28gPC0gaWZlbHNlKGlzLm5hKHd5X21pZWpzY2UkV1lfV1lEQVdOSUNUV09fSUQpLGFzLmNoYXJhY3Rlcih3eV9uYXp3YSR3eWRhd25pY3R3byksIiIpDQoNCiMyOA0KemFfcm9rX3d5ZGFuaWEgPC0gQk5fUEJMX3d5ZGF3bmljdHdhICU+JQ0KICBzZWxlY3QobGljem5paywgcm9rX3d5ZGFuaWEpICU+JQ0KICB1bmlxdWUoKQ0KemFfcm9rX3d5ZGFuaWEkcm9rX3d5ZGFuaWEgPC0gc3RyX3JlcGxhY2VfYWxsKHphX3Jva193eWRhbmlhJHJva193eWRhbmlhLCAiKC4qKShcXC4pIiwgIlxcMSIpDQp6YV9yb2tfd3lkYW5pYSRkb2JyeV9yb2sgPC0gaWZlbHNlKG5jaGFyKGFzLmNoYXJhY3Rlcih6YV9yb2tfd3lkYW5pYSRyb2tfd3lkYW5pYSkpPT00LGFzLmNoYXJhY3Rlcih6YV9yb2tfd3lkYW5pYSRyb2tfd3lkYW5pYSksTkEpDQp6YV9yb2tfd3lkYW5pYSRkb19vcGlzdSA8LSBpZmVsc2UoaXMubmEoemFfcm9rX3d5ZGFuaWEkZG9icnlfcm9rKSxwYXN0ZSgiWyIsc3RyX2V4dHJhY3QoemFfcm9rX3d5ZGFuaWEkcm9rX3d5ZGFuaWEsIlxcZHs0fSIpLCJdIixzZXAgPSAiIiksIiIpDQojMjkNCm1hcmNfZmllbGQzMDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KGxpY3puaWssWDMwMCkNCm1hcmNfZmllbGQzMDAkWDMwMDwtc3RyX3JlbW92ZV9hbGwobWFyY19maWVsZDMwMCRYMzAwLCJeXFx8IikNCm1hcmNfZmllbGQzMDAgPC0gbXV0YXRlKG1hcmNfZmllbGQzMDAsDQogICAgICAgICAgICAgICBpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwobWFyY19maWVsZDMwMCRYMzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDMwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkMzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQoNCm1hcmNfZmllbGQzMDA8LWNiaW5kKG1hcmNfZmllbGQzMDAsZW1wdHlfdGFibGUpDQoNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQoNCmZvciAoaSBpbiB4KSB7DQogIG1hcmNfZmllbGQzMDAkWDMwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkMzAwJFgzMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCn0NCmZvciAoaSBpbiB4KSB7DQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCnN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0Kc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0Kc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0Kc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KbWFyY19maWVsZDMwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkMzAwJFgzMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkMzAwJFgzMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCnByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgIA0KfQ0KbWFyY19maWVsZDMwMCRgJGFgIDwtIHN0cl9yZW1vdmUobWFyY19maWVsZDMwMCRgJGFgLCIgXFw7KyR8IFxcOiskIikNCm1hcmNfZmllbGQzMDAkYCRhYFtpcy5uYShtYXJjX2ZpZWxkMzAwJGAkYWApXSA8LSAiIg0KDQp6YV9vcGlzX2tzIDwtIGRhdGEuZnJhbWUob3Bpc19rcyA9IHBhc3RlKHphX3Jva193eWRhbmlhJGRvX29waXN1LCBtYXJjX2ZpZWxkMzAwJGAkYWAsbWFyY19maWVsZDMwMCRgJGJgLHNlcCA9ICIsICIpLCBsaWN6bmlrID0gYXMuaW50ZWdlcih6YV9yb2tfd3lkYW5pYSRsaWN6bmlrKSkNCnphX29waXNfa3Mkb3Bpc19rcyA8LSBzdHJfcmVwbGFjZSh6YV9vcGlzX2tzJG9waXNfa3MsIiwgLCAiLCAiLCAiKQ0KemFfb3Bpc19rcyRvcGlzX2tzIDwtIHN0cl9yZXBsYWNlKHphX29waXNfa3Mkb3Bpc19rcywiLCAsICIsICIsICIpDQp6YV9vcGlzX2tzJG9waXNfa3MgPC0gc3RyX3JlbW92ZV9hbGwoemFfb3Bpc19rcyRvcGlzX2tzLCAiXiwgfCwgJCIpDQp3c3BfaW5mbyA8LSBkYXRhLmZyYW1lKHdzcCA9IHBhc3RlKCJbV3Nww7PFgnd5ZC46ICIsQk5fYXV0b3IkYXV0b3J6eSwiOiAiLHphX3R5dHVsX2NvcHkkdHl0dWwsIl0iLCBzZXAgPSAiIiksIHphX3V3YWdpKQ0Kd3NwX2luZm8kemFfdXdhZ2kgPC0gc3RyX3JlbW92ZV9hbGwod3NwX2luZm8kemFfdXdhZ2ksIl8yIikNCndzcF9pbmZvICUkJSAgDQogICAgeyB6YV91d2FnaSA9PSBkcGx5cjo6bGFnKHphX3V3YWdpLCAxKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IHdzcF9pbmZvJHNhbWUNCndzcF9pbmZvJHNhbWVbMV0gPC0gMA0Kd3NwX2luZm8gPC0gZGF0YS5mcmFtZSh3c3BfaW5mbywgemFfdXdhZ2kpDQp3c3BfaW5mbyR6YV91d2FnaSA8LSBpZmVsc2UoZ3JlcGwoIl8yIiwgd3NwX2luZm8kemFfdXdhZ2kuMSksIGFzLmNoYXJhY3Rlcih3c3BfaW5mbyR6YV91d2FnaSkscGFzdGUod3NwX2luZm8kemFfdXdhZ2ksIl8yIixzZXAgPSAiIikpDQoNCndzcF9pbmZvIDwtIHdzcF9pbmZvICU+JQ0KICBzZWxlY3QoMSwyKQ0Kd3NwX2luZm8gPC0gbWVyZ2UoeD13c3BfaW5mbywgeT16YV91d2FnaSwgYnkgPSAiemFfdXdhZ2kiKQ0Kd3NwX2luZm8gPC0gd3NwX2luZm8gJT4lDQogIHNlbGVjdCgyLDMpDQp6YV9vcGlzX2Zpenljem55X2tzaWF6a2kgPC0gbWVyZ2UoeD16YV9vcGlzX2tzLHk9d3NwX2luZm8sIGJ5ID0gImxpY3puaWsiLGFsbCA9IFRSVUUpDQp6YV9vcGlzX2Zpenljem55X2tzaWF6a2kgPC0gZGF0YS5mcmFtZSh6YV9vcGlzX2Zpenljem55X2tzaWF6a2kgPSBwYXN0ZShzdHJfcmVwbGFjZV9hbGwoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpJG9waXNfa3MsIiguKikoY21cXC4pKC4qKSIsICJcXDFcXDIiKSwgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpJHdzcCwgc2VwID0gIiAiKSwgbGljem5payA9IHphX29waXNfZml6eWN6bnlfa3NpYXpraSRsaWN6bmlrKQ0KDQojMzANCm1hcmNfZmllbGQ0OTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KGxpY3puaWssWDQ5MCkNCm1hcmNfZmllbGQ0OTAgPC0gY1NwbGl0KG1hcmNfZmllbGQ0OTAsIlg0OTAiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpDQptYXJjX2ZpZWxkNDkwIDwtIG1hcmNfZmllbGQ0OTAlPiUNCiAgZmlsdGVyKFg0OTAhPSIiKQ0KbWFyY19maWVsZDQ5MCRYNDkwPC1zdHJfcmVtb3ZlX2FsbChtYXJjX2ZpZWxkNDkwJFg0OTAsIl5cXHwiKQ0KbWFyY19maWVsZDQ5MCA8LSBtdXRhdGUobWFyY19maWVsZDQ5MCwNCiAgICAgICAgICAgICAgIGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChtYXJjX2ZpZWxkNDkwJFg0OTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNDkwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGQ0OTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCg0KbWFyY19maWVsZDQ5MDwtY2JpbmQobWFyY19maWVsZDQ5MCxlbXB0eV90YWJsZSkNCg0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgbWFyY19maWVsZDQ5MCRYNDkwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGQ0OTAkWDQ5MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KfQ0KZm9yIChpIGluIHgpIHsNCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0Kc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQpzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQpzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQpzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQptYXJjX2ZpZWxkNDkwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGQ0OTAkWDQ5MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGQ0OTAkWDQ5MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSAgDQp9DQoNCm1hcmNfZmllbGQ0OTAkYCRhYCA8LSBzdHJfcmVtb3ZlKG1hcmNfZmllbGQ0OTAkYCRhYCwiIFxcOyskfCBcXDorJCIpDQptYXJjX2ZpZWxkNDkwJGAkYWBbaXMubmEobWFyY19maWVsZDQ5MCRgJGFgKV0gPC0gIiINCm1hcmNfZmllbGQ0OTAkYCR2YFtpcy5uYShtYXJjX2ZpZWxkNDkwJGAkdmApXSA8LSAiIg0KbWFyY19maWVsZDQ5MCRzZXJpYSA8LSBzdHJfcmVtb3ZlKHBhc3RlKCIoIixtYXJjX2ZpZWxkNDkwJGAkYWAsIiwgIixtYXJjX2ZpZWxkNDkwJGAkdmAsIikiLHNlcCA9ICIiKSwiLCAoPz1cXCkkKSIpDQoNCm1hcmNfZmllbGQ0OTAgPC0gbWFyY19maWVsZDQ5MCAlPiUNCiAgc2VsZWN0KGxpY3puaWssc2VyaWEpDQoNCm1hcmNfZmllbGQ0OTAgPC0gZGRwbHkobWFyY19maWVsZDQ5MCwgLihsaWN6bmlrKSwgc3VtbWFyaXplLCBzZXJpYSA9IHBhc3RlKHNlcmlhLCBjb2xsYXBzZT0iICIpKQ0KdGVzdCA8LSBkYXRhICU+JQ0KICBzZWxlY3QobGljem5paykNCnphX3NlcmlhX3d5ZGF3bmljemEgPC0gbWVyZ2UoeCA9IHRlc3QsIHkgPSBtYXJjX2ZpZWxkNDkwLCBieSA9ICJsaWN6bmlrIiwgYWxsID0gVFJVRSkNCiMzMQ0KemFfdG9teSA8LWRhdGEuZnJhbWUobGljem5paz0xOmxlbmd0aHMoZGF0YSksIHphX3RvbXkgPSBOQSkNCiMzMg0KcHJhY293bmlrIDwtIG1lcmdlKHggPSBkel9uYXp3YV9mdWxsLCB5ID0gcmVkYWt0b3J6eV9kemlhbG93LCBieS54ID0gIlRXX0RaX0RaSUFMX0lEIiwgYnkueSA9ICAiRFpfRFpJQUxfSUQiLCBhbGwueCA9IFRSVUUpDQpwcmFjb3duaWsgPC0gcHJhY293bmlrW29yZGVyKGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKHByYWNvd25payRsaWN6bmlrKSkpLF0NCnByYWNvd25payA8LSBwcmFjb3duaWsgJT4lDQogIHNlbGVjdChsaWN6bmlrLHJlZGFrdG9yX2R6aWFsdSkNCmNvbG5hbWVzKHByYWNvd25paykgPC0gYygibGljem5payIsICJwcmFjb3duaWsiKQ0KDQpkel9uYXp3YV9mdWxsIDwtIGRhdGEuZnJhbWUoZHpfbmF6d2FfZnVsbCwgcHJhY293bmlrID0gcHJhY293bmlrJHByYWNvd25paykNCiMzMyBhZG5vdGFjamUNCnphX2Fkbm90YWNqZSA8LSBkYXRhLmZyYW1lKGNiaW5kKGRhdGEkbGljem5paywgZGF0YSRYNTA1KSkNCmNvbG5hbWVzKHphX2Fkbm90YWNqZSkgPC0gYygibGljem5payIsIlg1MDUiKQ0KemFfYWRub3RhY2plJFg1MDUgPC0gaWZlbHNlKGlzLm5hKHphX2Fkbm90YWNqZSRYNTA1KSwiIixhcy5jaGFyYWN0ZXIoemFfYWRub3RhY2plJFg1MDUpKQ0KemFfYWRub3RhY2plJGFkbm90YWNqZSA8LSBwYXN0ZSh6YV9hZG5vdGFjamUkYWRub3RhY2plLHphX2Fkbm90YWNqZSRYNTA1LHNlcCA9ICJ8IikNCnphX2Fkbm90YWNqZSRhZG5vdGFjamVbemFfYWRub3RhY2plJGFkbm90YWNqZT09InwiXSA8LSAiIg0KemFfYWRub3RhY2plIDwtIHphX2Fkbm90YWNqZSAlPiUNCiAgc2VsZWN0KDEsMikNCiPFgsSFY3plbmllDQojd3lyw7N3bmFuaWUgbGljemJ5IHdpZXJzenkNCmF1dG9yenkgPC0gZGF0YS5mcmFtZShjYmluZChhbV9hdXRvcl9pZCRsaWN6bmlrLGFtX2F1dG9yX2lkJEFNX0FVVE9SX0lELGFzLmNoYXJhY3RlcihhbV9uYXp3aXNrbyRhbV9uYXp3aXNrbyksYXMuY2hhcmFjdGVyKGFtX2ltaWUkYW1faW1pZSkpKQ0KY29sbmFtZXMoYXV0b3J6eSkgPC0gYygibGljem5payIsICJBTV9BVVRPUl9JRCIsICJBTV9OQVpXSVNLTyIsICJBTV9JTUlFIikNCmF1dG9yenkkQU1fQVVUT1JfSUQgPC0gaWZlbHNlKGlzLm5hKGF1dG9yenkkQU1fQVVUT1JfSUQpLCIiLGFzLmNoYXJhY3RlcihhdXRvcnp5JEFNX0FVVE9SX0lEKSkNCmF1dG9yenkkQU1fTkFaV0lTS08gPC0gaWZlbHNlKGlzLm5hKGF1dG9yenkkQU1fTkFaV0lTS08pLCIiLGFzLmNoYXJhY3RlcihhdXRvcnp5JEFNX05BWldJU0tPKSkNCmF1dG9yenkkQU1fSU1JRSA8LSBpZmVsc2UoaXMubmEoYXV0b3J6eSRBTV9JTUlFKSwiIixhcy5jaGFyYWN0ZXIoYXV0b3J6eSRBTV9JTUlFKSkNCmF1dG9yenkgPC0gZGRwbHkoYXV0b3J6eSwgLihsaWN6bmlrKSwgc3VtbWFyaXplLCBBTV9BVVRPUl9JRCA9IHBhc3RlKEFNX0FVVE9SX0lELCBjb2xsYXBzZT0ifCIpLCBBTV9OQVpXSVNLTyA9IHBhc3RlKEFNX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBBTV9JTUlFID0gcGFzdGUoQU1fSU1JRSwgY29sbGFwc2U9InwiKSkNCmF1dG9yenkgPC0gYXV0b3J6eVtvcmRlcihhcy5pbnRlZ2VyKGFzLmNoYXJhY3RlcihhdXRvcnp5JGxpY3puaWspKSksXQ0KDQp3c3BvbHR3b3JjeSA8LSBkYXRhLmZyYW1lKGNiaW5kKEJOX1BCTF93c3BvbHR3b3JjeSRsaWN6bmlrLCBCTl9QQkxfd3Nwb2x0d29yY3kkT1NfT1NPQkFfSUQsYXMuY2hhcmFjdGVyKGJfb3NfbmF6d2lza28kb3NfbmF6d2lza28pLGFzLmNoYXJhY3RlcihiX29zX2ltaWUkb3NfaW1pZSksQk5fUEJMX3dzcG9sdHdvcmN5JGZvX3N5bWJvbCkpDQpjb2xuYW1lcyh3c3BvbHR3b3JjeSkgPC0gYygibGljem5payIsICJPU19PU09CQV9JRCIsICJPU19OQVpXSVNLTyIsICJPU19JTUlFIiwgIkZPX1NZTUJPTCIpDQp3c3BvbHR3b3JjeSRPU19PU09CQV9JRCA8LSBpZmVsc2UoaXMubmEod3Nwb2x0d29yY3kkT1NfT1NPQkFfSUQpLCIiLGFzLmNoYXJhY3Rlcih3c3BvbHR3b3JjeSRPU19PU09CQV9JRCkpDQp3c3BvbHR3b3JjeSRPU19OQVpXSVNLTyA8LSBpZmVsc2UoaXMubmEod3Nwb2x0d29yY3kkT1NfTkFaV0lTS08pLCIiLGFzLmNoYXJhY3Rlcih3c3BvbHR3b3JjeSRPU19OQVpXSVNLTykpDQp3c3BvbHR3b3JjeSRPU19JTUlFIDwtIGlmZWxzZShpcy5uYSh3c3BvbHR3b3JjeSRPU19JTUlFKSwiIixhcy5jaGFyYWN0ZXIod3Nwb2x0d29yY3kkT1NfSU1JRSkpDQp3c3BvbHR3b3JjeSRGT19TWU1CT0wgPC0gaWZlbHNlKGlzLm5hKHdzcG9sdHdvcmN5JEZPX1NZTUJPTCksIiIsYXMuY2hhcmFjdGVyKHdzcG9sdHdvcmN5JEZPX1NZTUJPTCkpDQp3c3BvbHR3b3JjeSA8LSBkZHBseSh3c3BvbHR3b3JjeSwgLihsaWN6bmlrKSwgc3VtbWFyaXplLCBPU19PU09CQV9JRCA9IHBhc3RlKE9TX09TT0JBX0lELCBjb2xsYXBzZT0ifCIpLCBPU19OQVpXSVNLTyA9IHBhc3RlKE9TX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBPU19JTUlFID0gcGFzdGUoT1NfSU1JRSwgY29sbGFwc2U9InwiKSwgRk9fU1lNQk9MID0gcGFzdGUoRk9fU1lNQk9MLCBjb2xsYXBzZT0ifCIpKQ0Kd3Nwb2x0d29yY3kgPC0gd3Nwb2x0d29yY3lbb3JkZXIoYXMuaW50ZWdlcihhcy5jaGFyYWN0ZXIod3Nwb2x0d29yY3kkbGljem5paykpKSxdDQoNCnd5ZGF3bmljdHdhIDwtIGRhdGEuZnJhbWUoY2JpbmQod3lfd3lkYXduaWN0d29faWQkbGljem5paywgd3lfd3lkYXduaWN0d29faWQkV1lfV1lEQVdOSUNUV09fSUQsd3lfbmF6d2Ekd3lkYXduaWN0d28sd3lfbWllanNjZSRtaWVqc2NlX3d5ZGFuaWEpKQ0KY29sbmFtZXMod3lkYXduaWN0d2EpIDwtIGMoImxpY3puaWsiLCAiV1lfV1lEQVdOSUNUV09fSUQiLCAiV1lfTkFaV0EiLCAiV1lfTUlFSlNDRSIpDQp3eWRhd25pY3R3YSRXWV9XWURBV05JQ1RXT19JRCA8LSBpZmVsc2UoaXMubmEod3lkYXduaWN0d2EkV1lfV1lEQVdOSUNUV09fSUQpLCIiLGFzLmNoYXJhY3Rlcih3eWRhd25pY3R3YSRXWV9XWURBV05JQ1RXT19JRCkpDQp3eWRhd25pY3R3YSRXWV9OQVpXQSA8LSBpZmVsc2UoaXMubmEod3lkYXduaWN0d2EkV1lfTkFaV0EpLCIiLGFzLmNoYXJhY3Rlcih3eWRhd25pY3R3YSRXWV9OQVpXQSkpDQp3eWRhd25pY3R3YSRXWV9NSUVKU0NFIDwtIGlmZWxzZShpcy5uYSh3eWRhd25pY3R3YSRXWV9NSUVKU0NFKSwiIixhcy5jaGFyYWN0ZXIod3lkYXduaWN0d2EkV1lfTUlFSlNDRSkpDQp3eWRhd25pY3R3YSA8LSBkZHBseSh3eWRhd25pY3R3YSwgLihsaWN6bmlrKSwgc3VtbWFyaXplLCBXWV9XWURBV05JQ1RXT19JRCA9IHBhc3RlKFdZX1dZREFXTklDVFdPX0lELCBjb2xsYXBzZT0ifCIpLCBXWV9OQVpXQSA9IHBhc3RlKFdZX05BWldBLCBjb2xsYXBzZT0ifCIpLCBXWV9NSUVKU0NFID0gcGFzdGUoV1lfTUlFSlNDRSwgY29sbGFwc2U9InwiKSkNCnd5ZGF3bmljdHdhIDwtIHd5ZGF3bmljdHdhW29yZGVyKGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdhJGxpY3puaWspKSksXQ0KDQpwb2xhY3pvbmUgPC0gZGF0YS5mcmFtZSgNCiAgbGljem5payA9IHphX3V3YWdpJGxpY3puaWssDQogIHJla29yZF9CTiA9IHphX3V3YWdpJHphX3V3YWdpLA0KICByel9uYXp3YSA9IHJ6X25hendhJHJ6X25hendhLA0KICB6YV9yb19yb2sgPSB6YV9yb19yb2skemFfcm9fcm9rLA0KICB6YV90eXBlID0gemFfdHlwZSR6YV90eXBlLA0KICByel9yb2R6YWpfaWQgPSByel9yb2R6YWpfaWQkUlpfUk9EWkFKX0lELA0KICBEWl9OQVpXQSA9IGR6X25hendhJERaX05BWldBLA0KICBEWl9EWklBTF9JRCA9IGR6X2R6aWFsX2lkJERaX0RaSUFMX0lELA0KICB0d190d29yY2FfaWQgPSB0d190d29yY2FfaWQkVFdfVFdPUkNBX0lELA0KICBhbV9hdXRvcl9pZCA9IGF1dG9yenkkQU1fQVVUT1JfSUQsDQogIGFtX25hendpc2tvID0gYXV0b3J6eSRBTV9OQVpXSVNLTywNCiAgYW1faW1pZSA9IGF1dG9yenkkQU1fSU1JRSwNCiAgemFfdHl0dWwgPSB6YV90eXR1bCR0eXR1bCwNCiAgemFfdHl0dWxfb3J5Z2luYWx1ID0gemFfdHl0dWxfb3J5Z2luYWx1JHR5dHVsLA0KICB6YV9qZXp5a19vcnlnaW5hbHUgPSB6YV9qZXp5a19vcnlnaW5hbHUkamV6eWtfb3J5Z2luYWx1LA0KICBvc19vc29iYV9pZCA9IHdzcG9sdHdvcmN5JE9TX09TT0JBX0lELA0KICBvc19uYXp3aXNrbyA9IHdzcG9sdHdvcmN5JE9TX05BWldJU0tPLA0KICBvc19pbWllID0gd3Nwb2x0d29yY3kkT1NfSU1JRSwNCiAgZm9fc3ltYm9sID0gd3Nwb2x0d29yY3kkRk9fU1lNQk9MLA0KICB6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHphX29waXNfd3Nwb2x0d29yY293JHphX29waXNfd3Nwb2x0d29yY293LA0KICB6YV93eWRhbmllID0gemFfd3lkYW5pZSR6YV93eWRhbmllLA0KICB6YV90b215ID0gemFfdG9teSR6YV90b215LA0KICB6YV9pbnN0eXR1Y2phID0gemFfaW5zdHl0dWNqYSRpbnN0eXR1Y2phLA0KICB3eV93eWRhd25pY3R3b19pZCA9IHd5ZGF3bmljdHdhJFdZX1dZREFXTklDVFdPX0lELA0KICB3eV9taWVqc2NlID0gd3lkYXduaWN0d2EkV1lfTUlFSlNDRSwNCiAgd3lfbmF6d2EgPSB3eWRhd25pY3R3YSRXWV9OQVpXQSwNCiAgemFfcm9rX3d5ZGFuaWEgPSB6YV9yb2tfd3lkYW5pYSRkb2JyeV9yb2ssDQogIHphX29waXNfZml6eWN6bnlfa3NpYXpraSA9IHphX29waXNfZml6eWN6bnlfa3NpYXpraSR6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksDQogIHphX3NlcmlhX3d5ZGF3bmljemEgPSB6YV9zZXJpYV93eWRhd25pY3phJHNlcmlhLA0KICB0d19uYXp3aXNrbyA9IHR3X25hendpc2tvJFRXX05BWldJU0tPLA0KICB0d19pbWllID0gdHdfaW1pZSRUV19JTUlFLA0KICBwcmFjb3duaWsgPSBwcmFjb3duaWskcHJhY293bmlrLA0KICB6YV9hZG5vdGFjamUgPSB6YV9hZG5vdGFjamUkWDUwNQ0KKQ0KDQpvdXQgPC0gY1NwbGl0KHBvbGFjem9uZSwgYygiYW1fYXV0b3JfaWQiLCAiYW1fbmF6d2lza28iLCAiYW1faW1pZSIsIm9zX29zb2JhX2lkIiwib3NfbmF6d2lza28iLCAib3NfaW1pZSIsICJmb19zeW1ib2wiLCJ3eV93eWRhd25pY3R3b19pZCIsInd5X21pZWpzY2UiLCJ3eV9uYXp3YSIpLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpDQpvdXQgPC0gb3V0ICU+JQ0KICB1bmlxdWUoKQ0Kb3V0JGxpY3puaWsgPC0gaWZlbHNlKGlzLm5hKG91dCRsaWN6bmlrKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGxpY3puaWspKQ0Kb3V0JHJla29yZF9CTiA8LSBpZmVsc2UoaXMubmEob3V0JHJla29yZF9CTiksJycsYXMuY2hhcmFjdGVyKG91dCRyZWtvcmRfQk4pKQ0Kb3V0JHJ6X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfbmF6d2EpKQ0Kb3V0JHphX3JvX3JvayA8LSBpZmVsc2UoaXMubmEob3V0JHphX3JvX3JvayksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb19yb2spKQ0Kb3V0JHphX3R5cGUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXBlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5cGUpKQ0Kb3V0JHJ6X3JvZHphal9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X3JvZHphal9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRyel9yb2R6YWpfaWQpKQ0Kb3V0JERaX05BWldBIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfTkFaV0EpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfTkFaV0EpKQ0Kb3V0JERaX0RaSUFMX0lEIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfRFpJQUxfSUQpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfRFpJQUxfSUQpKQ0Kb3V0JHR3X3R3b3JjYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHR3X3R3b3JjYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCR0d190d29yY2FfaWQpKQ0Kb3V0JGFtX2F1dG9yX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fYXV0b3JfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fYXV0b3JfaWQpKQ0Kb3V0JGFtX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fbmF6d2lza28pKQ0Kb3V0JGFtX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2ltaWUpKQ0Kb3V0JHphX3R5dHVsIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWwpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWwpKQ0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpKQ0Kb3V0JHphX2plenlrX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2plenlrX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpKQ0Kb3V0JG9zX29zb2JhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkb3Nfb3NvYmFfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3Nfb3NvYmFfaWQpKQ0Kb3V0JG9zX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfbmF6d2lza28pKQ0Kb3V0JG9zX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX2ltaWUpKQ0Kb3V0JGZvX3N5bWJvbCA8LSBpZmVsc2UoaXMubmEob3V0JGZvX3N5bWJvbCksJycsYXMuY2hhcmFjdGVyKG91dCRmb19zeW1ib2wpKQ0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293IDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpKQ0Kb3V0JHphX3d5ZGFuaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV93eWRhbmllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3d5ZGFuaWUpKQ0Kb3V0JHphX3RvbXkgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90b215KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3RvbXkpKQ0Kb3V0JHphX2luc3R5dHVjamEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9pbnN0eXR1Y2phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2luc3R5dHVjamEpKQ0Kb3V0JHd5X3d5ZGF3bmljdHdvX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfd3lkYXduaWN0d29faWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfd3lkYXduaWN0d29faWQpKQ0Kb3V0JHd5X21pZWpzY2UgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9taWVqc2NlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X21pZWpzY2UpKQ0Kb3V0JHd5X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbmF6d2EpKQ0Kb3V0JHphX3Jva193eWRhbmlhIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9rX3d5ZGFuaWEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9rX3d5ZGFuaWEpKQ0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpKQ0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpKQ0Kb3V0JHR3X25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfbmF6d2lza28pKQ0Kb3V0JHR3X2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR0d19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X2ltaWUpKQ0Kb3V0JHByYWNvd25payA8LSBpZmVsc2UoaXMubmEob3V0JHByYWNvd25payksJycsYXMuY2hhcmFjdGVyKG91dCRwcmFjb3duaWspKQ0Kb3V0JHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2Fkbm90YWNqZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKQ0KDQpvdXQgJSQlICANCiAgICB7IGxpY3puaWsgPT0gZHBseXI6OmxhZyhsaWN6bmlrLCAxKSAmIHJla29yZF9CTj09bGFnKHJla29yZF9CTiwpICYgcnpfbmF6d2E9PWxhZyhyel9uYXp3YSwpICYgemFfcm9fcm9rPT1sYWcoemFfcm9fcm9rLCkgJiB6YV90eXBlPT1sYWcoemFfdHlwZSwpICYgcnpfcm9kemFqX2lkPT1sYWcocnpfcm9kemFqX2lkLCkgJiBEWl9OQVpXQT09bGFnKERaX05BWldBLCkgJiBEWl9EWklBTF9JRD09bGFnKERaX0RaSUFMX0lELCkgJiB0d190d29yY2FfaWQ9PWxhZyh0d190d29yY2FfaWQsKSAmIHphX3R5dHVsPT1sYWcoemFfdHl0dWwsKSAmIHphX3R5dHVsX29yeWdpbmFsdT09bGFnKHphX3R5dHVsX29yeWdpbmFsdSwpICYgemFfamV6eWtfb3J5Z2luYWx1PT1sYWcoemFfamV6eWtfb3J5Z2luYWx1LCkgJiB6YV9vcGlzX3dzcG9sdHdvcmNvdz09bGFnKHphX29waXNfd3Nwb2x0d29yY293LCkgJiB6YV93eWRhbmllPT1sYWcoemFfd3lkYW5pZSwpICYgemFfdG9teT09bGFnKHphX3RvbXksKSAmIHphX2luc3R5dHVjamE9PWxhZyh6YV9pbnN0eXR1Y2phLCkgJiB6YV9yb2tfd3lkYW5pYT09bGFnKHphX3Jva193eWRhbmlhLCkgJiB6YV9vcGlzX2Zpenljem55X2tzaWF6a2k9PWxhZyh6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksKSAmIHphX3NlcmlhX3d5ZGF3bmljemE9PWxhZyh6YV9zZXJpYV93eWRhd25pY3phLCkgJiB0d19uYXp3aXNrbz09bGFnKHR3X25hendpc2tvLCkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpICYgcHJhY293bmlrPT1sYWcocHJhY293bmlrLCkgJiB6YV9hZG5vdGFjamU9PWxhZyh6YV9hZG5vdGFjamUsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQpvdXQkc2FtZVsxXSA8LSAwDQpvdXQkZHppZWxvbmUgPC0gcGFzdGUob3V0JGFtX2F1dG9yX2lkLG91dCRhbV9uYXp3aXNrbyxvdXQkYW1faW1pZSxvdXQkb3Nfb3NvYmFfaWQsb3V0JG9zX25hendpc2tvLG91dCRvc19pbWllLG91dCRmb19zeW1ib2wsb3V0JHd5X3d5ZGF3bmljdHdvX2lkLG91dCR3eV9taWVqc2NlLG91dCR3eV9uYXp3YSxzZXAgPSAiIikNCg0Kb3V0IDwtIG91dCAlPiUNCiAgZmlsdGVyKCEoc2FtZT09MSZkemllbG9uZT09IiIpKSAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCm91dCAlJCUgIA0KICAgIHsgbGljem5payA9PSBkcGx5cjo6bGFnKGxpY3puaWssIDEpICYgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCg0Kb3V0JHJla29yZF9CTltvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X25hendhW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9fcm9rW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHlwZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHJ6X3JvZHphal9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JERaX05BWldBW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfRFpJQUxfSURbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d190d29yY2FfaWRbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXR1bFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2plenlrX29yeWdpbmFsdVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfd3lkYW5pZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3RvbXlbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9pbnN0eXR1Y2phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfcm9rX3d5ZGFuaWFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2lbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9zZXJpYV93eWRhd25pY3phW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfbmF6d2lza29bb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19pbWllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcHJhY293bmlrW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfYWRub3RhY2plW291dCRzYW1lID09IDFdIDwtICIiDQoNCm91dCA8LSBvdXQgJT4lDQogIHNlbGVjdCgxOjMzKQ0Kd3JpdGUuY3N2MihvdXQsICJDOi9Vc2Vycy9DZXphcnkvRGVza3RvcC8yMDA1LTIwMDhfaGFybGVxdWlueV9kb19pbXBvcnR1LmNzdiIsIHJvdy5uYW1lcyA9IEYsIG5hID0gJycsIGZpbGVFbmNvZGluZyA9ICdXaW5kb3dzLTEyNTAnKQ0KI291dCA8LSByZWFkLmNzdjIoIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMDUtMjAwOF9wb2RtaW90b3dhX2RvX2ltcG9ydHUuY3N2IiwgZW5jb2RpbmcgPSAiV2luZG93cy0xMjUwIiwgaGVhZGVyID0gVFJVRSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KI291dCRyZWtvcmRfQk4gPC0gaWZlbHNlKGlzLm5hKG91dCRyZWtvcmRfQk4pLCIiLCBhcy5jaGFyYWN0ZXIob3V0JHJla29yZF9CTikpDQojb3V0JHJla29yZF9CTiA8LSBpZmVsc2UobmNoYXIob3V0JHJla29yZF9CTik9PTEzLG91dCRyZWtvcmRfQk4sIHNwcmludGYoIiUwMTNkIiwgYXMuaW50ZWdlcihvdXQkcmVrb3JkX0JOKSkpDQojb3V0JHJla29yZF9CTltvdXQkcmVrb3JkX0JOPT0iICAgICAgICAgICBOQSJdIDwtICIiDQpgYGANCg0KYGBge3IgaGFybGVxdWluIC0gcG9tb2N9DQojdHfDs3JjeQ0KbWVtb3J5LmxpbWl0KDEwMDAwMCkNCm5vd2lfdHdvcmN5IDwtIG91dCAlPiUNCiAgc2VsZWN0KGxpY3puaWssIHR3X25hendpc2tvLCB0d19pbWllKQ0Kbm93aV90d29yY3kgPC0gbm93aV90d29yY3kgJT4lDQogIGZpbHRlcih0d19uYXp3aXNrbyE9IiIpDQpub3dpX3R3b3JjeSA8LSBub3dpX3R3b3JjeVtvcmRlcihub3dpX3R3b3JjeSR0d19uYXp3aXNrbywgbm93aV90d29yY3kkdHdfbmF6d2lza28sIGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKG5vd2lfdHdvcmN5JGxpY3puaWspKSksXQ0Kbm93aV90d29yY3kgJSQlICANCiAgICB7IHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sMSkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gbm93aV90d29yY3kkc2FtZQ0Kbm93aV90d29yY3kkc2FtZVsxXSA8LSAwDQpub3dpX3R3b3JjeSA8LSBub3dpX3R3b3JjeSAlPiUNCiAgZmlsdGVyKHNhbWU9PTApICU+JQ0KICBzZWxlY3QoLXNhbWUpDQpuYXp3YSA8LSBpZmVsc2UoaXMubmEobm93aV90d29yY3kkdHdfaW1pZSksYXMuY2hhcmFjdGVyKG5vd2lfdHdvcmN5JHR3X25hendpc2tvKSxwYXN0ZShub3dpX3R3b3JjeSR0d19uYXp3aXNrbyxub3dpX3R3b3JjeSR0d19pbWllLCBzZXAgPSAiIikpDQpuYXp3YSA8LSBkYXRhLmZyYW1lKG5hendhID0gc3RyX3RvX2xvd2VyKHN0cl9yZXBsYWNlX2FsbChuYXp3YSwgIlxcVyIsICIiKSkpDQpub3dpX3R3b3JjeSA8LSBkYXRhLmZyYW1lKG5vd2lfdHdvcmN5LG5hendhKQ0KdHdvcmN5X3BibCA8LSBQQkxfdHdvcmN5ICU+JQ0KICBzZWxlY3QoMSwyLDMsMTgpDQoNCnggPC0gMTpsZW5ndGgobm93aV90d29yY3kkbGljem5paykNCg0KdHdvcmN5X2NoZWNrIDwtIGRhdGEuZnJhbWUobGljem5payA9IGFzLmNoYXJhY3RlcigpLCBibl9uYXp3aXNrbyA9IGFzLmNoYXJhY3RlcigpLCBibl9pbWllID0gYXMuY2hhcmFjdGVyKCksIG5fYXV0ID0gYXMuY2hhcmFjdGVyKCksIFRXX1RXT1JDQV9JRCA9IGFzLmNoYXJhY3RlcigpLCBUV19OQVpXSVNLTyA9IGFzLmNoYXJhY3RlcigpLCBUV19JTUlFID0gYXMuY2hhcmFjdGVyKCksIFYxID0gYXMuY2hhcmFjdGVyKCksIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpDQpmb3IgKGkgaW4geCkgew0KcHJvZ3Jlc3MoaSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KbGtqIDwtIGFzLm1hdHJpeChzdHJpbmdkaXN0bWF0cml4KGE9bm93aV90d29yY3kkbmF6d2FbaV0sYj10d29yY3lfcGJsJG5hendhLCBtZXRob2QgPSAianciKSkNCmxraiA8LSBkYXRhLmZyYW1lKFYxID0gYXMudmVjdG9yKGxraikpDQpramggPC0gZGF0YS5mcmFtZShsaWN6bmlrID0gcmVwKG5vd2lfdHdvcmN5JGxpY3puaWtbaV0sIGxlbmd0aCh0d29yY3lfcGJsJG5hendhKSksIGJuX25hendpc2tvID0gcmVwKG5vd2lfdHdvcmN5JHR3X25hendpc2tvW2ldLCBsZW5ndGgodHdvcmN5X3BibCRuYXp3YSkpLCBibl9pbWllID0gcmVwKG5vd2lfdHdvcmN5JHR3X2ltaWVbaV0sIGxlbmd0aCh0d29yY3lfcGJsJG5hendhKSksIG5fYXV0ID0gcmVwKG5vd2lfdHdvcmN5JG5hendhW2ldLCBsZW5ndGgodHdvcmN5X3BibCRuYXp3YSkpLCB0d29yY3lfcGJsLCBsa2opDQpramggPC0ga2poW29yZGVyKGtqaCRWMSksXQ0Ka2poIDwtIGtqaCAlPiUNCiAgdG9wX24oLTUsVjEpDQp0d29yY3lfY2hlY2sgPC0gcmJpbmQodHdvcmN5X2NoZWNrLGtqaCkNCn0NCndyaXRlLmNzdjIodHdvcmN5X2NoZWNrLCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvMjAwNS0yMDA4X3R3b3JjeV9jaGVja19oYXIuY3N2Iiwgcm93Lm5hbWVzID0gRiwgbmEgPSAnJywgZmlsZUVuY29kaW5nID0gJ1dpbmRvd3MtMTI1MCcpDQoNCiN3eWRhd25pY3R3YQ0Kbm93ZV93eWRhd25pY3R3byA8LSBvdXQgJT4lDQogIHNlbGVjdChsaWN6bmlrLCB3eV9taWVqc2NlLCB3eV9uYXp3YSkNCm5vd2Vfd3lkYXduaWN0d28gPC0gbm93ZV93eWRhd25pY3R3byAlPiUNCiAgZmlsdGVyKHd5X21pZWpzY2UhPSIiKQ0Kbm93ZV93eWRhd25pY3R3byA8LSBub3dlX3d5ZGF3bmljdHdvW29yZGVyKG5vd2Vfd3lkYXduaWN0d28kd3lfbmF6d2EsIG5vd2Vfd3lkYXduaWN0d28kd3lfbWllanNjZSwgYXMuaW50ZWdlcihhcy5jaGFyYWN0ZXIobm93ZV93eWRhd25pY3R3byRsaWN6bmlrKSkpLF0NCm5vd2Vfd3lkYXduaWN0d28gJSQlICANCiAgICB7IHd5X25hendhPT1sYWcod3lfbmF6d2EsMSkgJiB3eV9taWVqc2NlPT1sYWcod3lfbWllanNjZSwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gbm93ZV93eWRhd25pY3R3byRzYW1lDQpub3dlX3d5ZGF3bmljdHdvJHNhbWVbMV0gPC0gMA0Kbm93ZV93eWRhd25pY3R3byA8LSBub3dlX3d5ZGF3bmljdHdvICU+JQ0KICBmaWx0ZXIoc2FtZT09MCkgJT4lDQogIHNlbGVjdCgtc2FtZSkNCm5hendhIDwtIGlmZWxzZShpcy5uYShub3dlX3d5ZGF3bmljdHdvJHd5X25hendhKSxhcy5jaGFyYWN0ZXIobm93ZV93eWRhd25pY3R3byR3eV9taWVqc2NlKSxwYXN0ZShub3dlX3d5ZGF3bmljdHdvJHd5X21pZWpzY2Usbm93ZV93eWRhd25pY3R3byR3eV9uYXp3YSwgc2VwID0gIiIpKQ0KbmF6d2EgPC0gZGF0YS5mcmFtZShuYXp3YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwobmF6d2EsICJcXFciLCAiIikpKQ0Kbm93ZV93eWRhd25pY3R3byA8LSBkYXRhLmZyYW1lKG5vd2Vfd3lkYXduaWN0d28sbmF6d2EpDQp3eWRhd25pY3R3YV9wYmwgPC0gUEJMX3d5ZGF3bmljdHdhICU+JQ0KICBzZWxlY3QoMSwzLDIsMTApDQoNCnggPC0gMTpsZW5ndGgobm93ZV93eWRhd25pY3R3byRsaWN6bmlrKQ0KDQp3eWRhd25pY3R3YV9jaGVjayA8LSBkYXRhLmZyYW1lKGxpY3puaWsgPSBhcy5jaGFyYWN0ZXIoKSwgYm5fbWllanNjZSA9IGFzLmNoYXJhY3RlcigpLCBibl9uYXp3YSA9IGFzLmNoYXJhY3RlcigpLCBuX2F1dCA9IGFzLmNoYXJhY3RlcigpLCBXWV9XWURBV05JQ1RXT19JRCA9IGFzLmNoYXJhY3RlcigpLCBXWV9NSUVKU0NFID0gYXMuY2hhcmFjdGVyKCksIFdZX05BWldBID0gYXMuY2hhcmFjdGVyKCksIFYxID0gYXMuY2hhcmFjdGVyKCksIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpDQpmb3IgKGkgaW4geCkgew0KcHJvZ3Jlc3MoaSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KbGtqIDwtIGFzLm1hdHJpeChzdHJpbmdkaXN0bWF0cml4KGE9bm93ZV93eWRhd25pY3R3byRuYXp3YVtpXSxiPXd5ZGF3bmljdHdhX3BibCRuYXp3YV9wcm9zdGEsIG1ldGhvZCA9ICJqdyIpKQ0KbGtqIDwtIGRhdGEuZnJhbWUoVjEgPSBhcy52ZWN0b3IobGtqKSkNCmtqaCA8LSBkYXRhLmZyYW1lKGxpY3puaWsgPSByZXAobm93ZV93eWRhd25pY3R3byRsaWN6bmlrW2ldLCBsZW5ndGgod3lkYXduaWN0d2FfcGJsJG5hendhX3Byb3N0YSkpLCBibl9taWVqc2NlID0gcmVwKG5vd2Vfd3lkYXduaWN0d28kd3lfbWllanNjZVtpXSwgbGVuZ3RoKHd5ZGF3bmljdHdhX3BibCRuYXp3YV9wcm9zdGEpKSwgYm5fbmF6d2EgPSByZXAobm93ZV93eWRhd25pY3R3byR3eV9uYXp3YVtpXSwgbGVuZ3RoKHd5ZGF3bmljdHdhX3BibCRuYXp3YV9wcm9zdGEpKSwgbl9hdXQgPSByZXAobm93ZV93eWRhd25pY3R3byRuYXp3YVtpXSwgbGVuZ3RoKHd5ZGF3bmljdHdhX3BibCRuYXp3YV9wcm9zdGEpKSwgd3lkYXduaWN0d2FfcGJsLCBsa2opDQpramggPC0ga2poW29yZGVyKGtqaCRWMSksXQ0Ka2poIDwtIGtqaCAlPiUNCiAgdG9wX24oLTUsVjEpDQp3eWRhd25pY3R3YV9jaGVjayA8LSByYmluZCh3eWRhd25pY3R3YV9jaGVjayxramgpDQp9DQp3cml0ZS5jc3YyKHd5ZGF3bmljdHdhX2NoZWNrLCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvMjAwNS0yMDA4X3d5ZGF3bmljdHdhX2NoZWNrX2hhci5jc3YiLCByb3cubmFtZXMgPSBGLCBuYSA9ICcnLCBmaWxlRW5jb2RpbmcgPSAnV2luZG93cy0xMjUwJykNCmBgYA0KDQpgYGB7ciBha3R1YWxpemFjamEgaGFybGVxdWluw7N3fQ0KI3R3b3JjeQ0KdHdvcmN5X2NoZWNrX2hhciA8LSBnc19yZWFkKGdzX3RpdGxlKCIyMDA1LTIwMDhfdHdvcmN5X2NoZWNrX2hhciIpKQ0KdHdvcmN5X2NoZWNrX2hhciA8LSB0d29yY3lfY2hlY2tfaGFyICU+JQ0KICBmaWx0ZXIoZGVjeXpqYT09InRhayIpICU+JQ0KICBzZWxlY3QoYm5fbmF6d2lza28sIGJuX2ltaWUsIFRXX1RXT1JDQV9JRCkNCnR3b3JjeV9jaGVja19oYXIkbWVyZ2VfdHdvcmN5IDwtIHBhc3RlKHR3b3JjeV9jaGVja19oYXIkYm5fbmF6d2lza28sdHdvcmN5X2NoZWNrX2hhciRibl9pbWllLHNlcCA9ICJ8IikNCm91dCRtZXJnZV90d29yY3kgPC0gcGFzdGUob3V0JHR3X25hendpc2tvLG91dCR0d19pbWllLHNlcCA9ICJ8IikNCg0KZmluYWwgPC0gbWVyZ2UoeD1vdXQsIHk9dHdvcmN5X2NoZWNrX2hhciwgYnkgPSAibWVyZ2VfdHdvcmN5IiwgYWxsLnggPSBUUlVFKQ0KZmluYWwgPC1maW5hbFtvcmRlcihhcy5pbnRlZ2VyKGFzLmNoYXJhY3RlcihmaW5hbCRsaWN6bmlrKSksIGZpbmFsJERaX05BWldBLCBmaW5hbCRhbV9hdXRvcl9pZCwgZmluYWwkYW1fbmF6d2lza28sIGZpbmFsJG9zX29zb2JhX2lkLCBmaW5hbCRvc19uYXp3aXNrbywgZmluYWwkd3lfd3lkYXduaWN0d29faWQsIGZpbmFsJHd5X25hendhKSxdDQoNCmZpbmFsJFRXX1RXT1JDQV9JRFtmaW5hbCR0d19uYXp3aXNrbz09IiJ8ZmluYWwkdHdfbmF6d2lza28hPWZpbmFsJGJuX25hendpc2tvXSA8LSBOQQ0KZmluYWwkYm5fbmF6d2lza29bZmluYWwkdHdfbmF6d2lza289PSIifGZpbmFsJHR3X25hendpc2tvIT1maW5hbCRibl9uYXp3aXNrb10gPC0gTkENCmZpbmFsJGJuX2ltaWVbZmluYWwkdHdfbmF6d2lza289PSIifGZpbmFsJHR3X25hendpc2tvIT1maW5hbCRibl9uYXp3aXNrb10gPC0gTkENCg0KZmluYWwgPC0gbXV0YXRlKGZpbmFsLA0KICAgICAgICAgICAgICAgIG5hcHIgPSBpZmVsc2UoZmluYWwkdHdfdHdvcmNhX2lkPT0iIixhcy5jaGFyYWN0ZXIoZmluYWwkVFdfVFdPUkNBX0lEKSxhcy5jaGFyYWN0ZXIoZmluYWwkdHdfdHdvcmNhX2lkKSkpDQpmaW5hbCR0d190d29yY2FfaWQgPC0gZmluYWwkbmFwcg0KDQpmaW5hbCR0d19pbWllIDwtIGlmZWxzZShpcy5uYShmaW5hbCR0d190d29yY2FfaWQpLGFzLmNoYXJhY3RlcihmaW5hbCR0d19pbWllKSxOQSkNCmZpbmFsJHR3X25hendpc2tvIDwtIGlmZWxzZShpcy5uYShmaW5hbCR0d190d29yY2FfaWQpLGFzLmNoYXJhY3RlcihmaW5hbCR0d19uYXp3aXNrbyksTkEpDQpmaW5hbCA8LSBmaW5hbCAlPiUgDQogIHNlbGVjdCgyOjM0KQ0KDQojd3lkYXduaWN0d2ENCnd5ZGF3bmljdHdhX2NoZWNrX2hhciA8LSBnc19yZWFkKGdzX3RpdGxlKCIyMDA1LTIwMDhfd3lkYXduaWN0d2FfY2hlY2tfaGFyIikpDQp3eWRhd25pY3R3YV9jaGVja19oYXIgPC0gd3lkYXduaWN0d2FfY2hlY2tfaGFyICU+JQ0KICBmaWx0ZXIoZGVjeXpqYT09InRhayIpICU+JQ0KICBzZWxlY3QoYm5fbmF6d2EsYm5fbWllanNjZSxXWV9XWURBV05JQ1RXT19JRCkNCg0Kd3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX21pZWpzY2UgPC0gc3RyX3JlbW92ZSh3eWRhd25pY3R3YV9jaGVja19oYXIkYm5fbWllanNjZSwiIFxcW3swLDEwfWV0Y1xcLnswLDEwfVxcXVxcc3swLDEwfSQiKQ0Kd3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX25hendhIDwtIHN0cl9yZW1vdmUod3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX25hendhLCIgXFxbezAsMTB9ZXRjXFwuezAsMTB9XFxzezAsMTB9JCIpDQp3eWRhd25pY3R3YV9jaGVja19oYXIkYm5fbWllanNjZSA8LSBpZmVsc2UoZ3JlcGwoIlxcWyIsd3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX21pZWpzY2UpJiFncmVwbCgiXFxdIix3eWRhd25pY3R3YV9jaGVja19oYXIkYm5fbWllanNjZSksc3RyX3JlbW92ZShCTl93eWRhd25pY3R3byRibl9taWVqc2NlLCJcXFsiKSxhcy5jaGFyYWN0ZXIod3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX21pZWpzY2UpKQ0Kd3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX25hendhIDwtIGlmZWxzZShncmVwbCgiXFxdIix3eWRhd25pY3R3YV9jaGVja19oYXIkYm5fbmF6d2EpJiFncmVwbCgiXFxbIix3eWRhd25pY3R3YV9jaGVja19oYXIkYm5fbmF6d2EpLHN0cl9yZW1vdmUod3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX25hendhLCJcXF0iKSxhcy5jaGFyYWN0ZXIod3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX25hendhKSkNCg0Kd3lkYXduaWN0d2FfY2hlY2tfaGFyJG1lcmdlX3d5ZCA8LSBwYXN0ZSh3eWRhd25pY3R3YV9jaGVja19oYXIkYm5fbmF6d2Esd3lkYXduaWN0d2FfY2hlY2tfaGFyJGJuX21pZWpzY2Usc2VwID0gInwiKQ0KZmluYWwkbWVyZ2Vfd3lkIDwtIHBhc3RlKGZpbmFsJHd5X25hendhLGZpbmFsJHd5X21pZWpzY2Usc2VwID0gInwiKQ0KDQpmaW5hbCA8LSBtZXJnZSh4PWZpbmFsLCB5PXd5ZGF3bmljdHdhX2NoZWNrX2hhciwgYnkgPSAibWVyZ2Vfd3lkIiwgYWxsLnggPSBUUlVFKQ0KDQpmaW5hbCA8LWZpbmFsW29yZGVyKGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKGZpbmFsJGxpY3puaWspKSwgZmluYWwkRFpfTkFaV0EsIGZpbmFsJGFtX2F1dG9yX2lkLCBmaW5hbCRhbV9uYXp3aXNrbywgZmluYWwkb3Nfb3NvYmFfaWQsIGZpbmFsJG9zX25hendpc2tvLCBmaW5hbCR3eV93eWRhd25pY3R3b19pZCwgZmluYWwkd3lfbmF6d2EpLF0NCg0KZmluYWwkV1lfV1lEQVdOSUNUV09fSURbZmluYWwkd3lfbmF6d2E9PSIiJmlzLm5hKGZpbmFsJHd5X21pZWpzY2UpXSA8LSBOQQ0KZmluYWwkd3lfbWllanNjZVtmaW5hbCR3eV9uYXp3YT09IiImaXMubmEoZmluYWwkd3lfbWllanNjZSldIDwtIE5BDQpmaW5hbCR3eV9uYXp3YVtmaW5hbCR3eV9uYXp3YT09IiImaXMubmEoZmluYWwkd3lfbWllanNjZSldIDwtIE5BDQoNCmZpbmFsIDwtIG11dGF0ZShmaW5hbCwNCiAgICAgICAgICAgICAgICBuYXByID0gaWZlbHNlKGZpbmFsJHd5X3d5ZGF3bmljdHdvX2lkPT0iIixhcy5jaGFyYWN0ZXIoZmluYWwkV1lfV1lEQVdOSUNUV09fSUQpLGFzLmNoYXJhY3RlcihmaW5hbCR3eV93eWRhd25pY3R3b19pZCkpKQ0KZmluYWwkd3lfd3lkYXduaWN0d29faWQgPC0gZmluYWwkbmFwcg0KDQpmaW5hbCR3eV9taWVqc2NlIDwtIGlmZWxzZShpcy5uYShmaW5hbCR3eV93eWRhd25pY3R3b19pZCksYXMuY2hhcmFjdGVyKGZpbmFsJHd5X21pZWpzY2UpLE5BKQ0KZmluYWwkd3lfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKGZpbmFsJHd5X3d5ZGF3bmljdHdvX2lkKSxhcy5jaGFyYWN0ZXIoZmluYWwkd3lfbmF6d2EpLE5BKQ0KZmluYWwgPC0gZmluYWwgJT4lDQogIHNlbGVjdCgyOjM0KQ0KZmluYWwkcmVrb3JkX0JOIDwtIGlmZWxzZShmaW5hbCRyZWtvcmRfQk49PSIiLCIiLHBhc3RlKCInIixmaW5hbCRyZWtvcmRfQk4sc2VwID0gIiIpKQ0Kd3JpdGUuY3N2MihmaW5hbCwgIkM6L1VzZXJzL0NlemFyeS9EZXNrdG9wLzIwMDVfMjAwOF9oYXJsZXF1aW55X2dvdG93ZS5jc3YiLCByb3cubmFtZXMgPSBGLCBuYSA9ICcnLCBmaWxlRW5jb2RpbmcgPSAnV2luZG93cy0xMjUwJykNCiN3cml0ZS5jc3YyKGZpbmFsLCAiQzovVXNlcnMvY2V6YXIvRGVza3RvcC9nb3Rvd2UuY3N2Iiwgcm93Lm5hbWVzID0gRiwgbmEgPSAnJywgZmlsZUVuY29kaW5nID0gJ1dpbmRvd3MtMTI1MCcpDQpgYGANCg0K